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