二叉树遍历算法和源码
2015-05-13 23:23
190 查看
1.二叉树几种遍历方法
1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴访问根结点;
⑵遍历左子树;
⑶遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
中序投影法
计算中序遍历拥有比较简单直观的投影法,如图
中序遍历的投影法
层序遍历
除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
【例】上图所示的二叉树中结点C,其前序前驱结点是D,前序后继结点是E;中序前驱结点是E,中序后继结点是F;后序前驱结点是F,后序后继结点是A。但是就该树的逻辑结构而言,C的前驱结点是A,后继结点是E和F。
2.二叉链表基本思想
基于先序遍历的构造,即以二叉树的先序序列为输入构造。
注意:
先序序列中必须加入虚结点以示空指针的位置。
3.二叉树C#遍历算法源码
C# code:
/// <summary>
/// 二叉树结点
/// </summary>
public class TreeNode
{
/// <summary>
/// 数据
/// </summary>
public object Data { get; set; }
/// <summary>
/// 左子树
/// </summary>
public TreeNode Left { get; set; }
/// <summary>
/// 右子树
/// </summary>
public TreeNode Right { get; set; }
}
public class Test
{
/// <summary>
/// 先序创建二叉数
/// </summary>
public static void CreateTree( TreeNode node )
{
node.Data = Console.ReadLine();
if ( node.Data == null || String.IsNullOrEmpty(node.Data.ToString() ) ) return;
node.Left = new TreeNode();
CreateTree(node.Left );
if ( node.Left.Data == null ) node.Left = null;
node.Right = new TreeNode();
CreateTree(node.Right );
if ( node.Right.Data == null ) node.Right = null;
}
/// <summary>
/// 先序遍历
/// </summary>
/// <paramname="node"></param>
/// <returns></returns>
public static void firstRoot( TreeNode node )
{
if ( node == null ) return;
Console.WriteLine( node.Data );
firstRoot(node.Left );
firstRoot(node.Right );
}
/// <summary>
/// 中序遍历
/// </summary>
/// <paramname="node"></param>
/// <returns></returns>
public static void MiddleRoot( TreeNode node )
{
if ( node == null ) return;
MiddleRoot(node.Left );
Console.WriteLine( node.Data );
MiddleRoot(node.Right );
}
/// <summary>
/// 后序遍历
/// </summary>
/// <paramname="node"></param>
/// <returns></returns>
public static void LaterRoot( TreeNode node )
{
if ( node == null ) return;
LaterRoot(node.Left );
LaterRoot(node.Right );
Console.WriteLine( node.Data );
}
/// <summary>
/// 层序遍历
/// </summary>
/// <paramname="node"></param>
public static void LevelRoot( TreeNode tree )
{
Queue<object> queue = new Queue<object>();
queue.Enqueue( tree );
while ( queue.Count > 0 )
{
TreeNode node = queue.Dequeue() as TreeNode;
Console.WriteLine( node.Data );
if ( node.Left != null ) queue.Enqueue( node.Left );
if ( node.Right != null ) queue.Enqueue( node.Right );
}
}
}
TreeNode node = new TreeNode();
Test.CreateTree( node );
Test.firstRoot( node );
Test.MiddleRoot( node );
Test.LaterRoot( node );
Test.LevelRoot( node );
创建的时候,是先序创建树
参考输入
A
回车
B
回车
D
回车
回车
回车
E
回车
回车
回车
C
回车
F
回车
回车
回车
G
回车
回车
回车
得到的层序遍历结果应该是
A
B
C
D
E
F
G
1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴访问根结点;
⑵遍历左子树;
⑶遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
中序投影法
计算中序遍历拥有比较简单直观的投影法,如图
中序遍历的投影法
层序遍历
除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
【例】上图所示的二叉树中结点C,其前序前驱结点是D,前序后继结点是E;中序前驱结点是E,中序后继结点是F;后序前驱结点是F,后序后继结点是A。但是就该树的逻辑结构而言,C的前驱结点是A,后继结点是E和F。
2.二叉链表基本思想
基于先序遍历的构造,即以二叉树的先序序列为输入构造。
注意:
先序序列中必须加入虚结点以示空指针的位置。
3.二叉树C#遍历算法源码
C# code:
/// <summary>
/// 二叉树结点
/// </summary>
public class TreeNode
{
/// <summary>
/// 数据
/// </summary>
public object Data { get; set; }
/// <summary>
/// 左子树
/// </summary>
public TreeNode Left { get; set; }
/// <summary>
/// 右子树
/// </summary>
public TreeNode Right { get; set; }
}
public class Test
{
/// <summary>
/// 先序创建二叉数
/// </summary>
public static void CreateTree( TreeNode node )
{
node.Data = Console.ReadLine();
if ( node.Data == null || String.IsNullOrEmpty(node.Data.ToString() ) ) return;
node.Left = new TreeNode();
CreateTree(node.Left );
if ( node.Left.Data == null ) node.Left = null;
node.Right = new TreeNode();
CreateTree(node.Right );
if ( node.Right.Data == null ) node.Right = null;
}
/// <summary>
/// 先序遍历
/// </summary>
/// <paramname="node"></param>
/// <returns></returns>
public static void firstRoot( TreeNode node )
{
if ( node == null ) return;
Console.WriteLine( node.Data );
firstRoot(node.Left );
firstRoot(node.Right );
}
/// <summary>
/// 中序遍历
/// </summary>
/// <paramname="node"></param>
/// <returns></returns>
public static void MiddleRoot( TreeNode node )
{
if ( node == null ) return;
MiddleRoot(node.Left );
Console.WriteLine( node.Data );
MiddleRoot(node.Right );
}
/// <summary>
/// 后序遍历
/// </summary>
/// <paramname="node"></param>
/// <returns></returns>
public static void LaterRoot( TreeNode node )
{
if ( node == null ) return;
LaterRoot(node.Left );
LaterRoot(node.Right );
Console.WriteLine( node.Data );
}
/// <summary>
/// 层序遍历
/// </summary>
/// <paramname="node"></param>
public static void LevelRoot( TreeNode tree )
{
Queue<object> queue = new Queue<object>();
queue.Enqueue( tree );
while ( queue.Count > 0 )
{
TreeNode node = queue.Dequeue() as TreeNode;
Console.WriteLine( node.Data );
if ( node.Left != null ) queue.Enqueue( node.Left );
if ( node.Right != null ) queue.Enqueue( node.Right );
}
}
}
TreeNode node = new TreeNode();
Test.CreateTree( node );
Test.firstRoot( node );
Test.MiddleRoot( node );
Test.LaterRoot( node );
Test.LevelRoot( node );
创建的时候,是先序创建树
参考输入
A
回车
B
回车
D
回车
回车
回车
E
回车
回车
回车
C
回车
F
回车
回车
回车
G
回车
回车
回车
得到的层序遍历结果应该是
A
B
C
D
E
F
G
相关文章推荐
- 源码可以开源,笔记为什么不可以开放
- tomcat源码阅读23
- 支持正向反向 Geocoder 的源码
- android仿iPhone滚轮控件实现及源码分析(一)
- 编译运行xmind3.2源码
- 用链表实现栈C++实现源码
- Guava缓存器源码分析——缓存统计器
- 源码中TODO、FIXME和XXX的含义
- 【Java】【Flume】Flume-NG启动过程源码分析(一)
- 【Android重量级】高仿大众点评源码
- Awesomium源码及编译
- 【进阶android】ListView源码分析——总述
- Jsoup解析网页源码时常用的Element(s)类
- opentsdb源码分析---Deferred
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- 15款Cocos2d-x游戏源码
- linux内存源码分析 - SLAB分配器概述
- Android 特殊用户通知用法汇总 - Notification 源码分析
- backbone源码解读(一篇全)
- spring源码学习之路---深入AOP(终)