二叉树遍历算法和源码

1.二叉树几种遍历方法

1.先(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

访问根结点;

遍历左子树;

遍历右子树。

2.中(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

遍历左子树;

访问根结点;

遍历右子树。

3.后(根)序遍历得递归算法定义:

若二叉树非空,则依次执行如下操作:

遍历左子树;

遍历右子树;

访问根结点。

中序投影法

计算中序遍历拥有比较简单直观的投影法,如图


中序遍历的投影法

层序遍历

除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

【例】上图所示的二叉树中结点C,其前序前驱结点是D,前序后继结点是E;中序前驱结点是E,中序后继结点是F;后序前驱结点是F,后序后继结点是A。但是就该树的逻辑结构而言,C的前驱结点是A,后继结点是EF

 

2.二叉链表基本思想

基于先序遍历的构造,即以二叉树的先序序列为输入构造。

注意:

先序序列中必须加入虚结点以示空指针的位置。

3.二叉树C#遍历算法源码

C# code:

/// <summary>
    
/// 二叉树结点
    
/// </summary>
    public class TreeNode
    {
        /// <summary>
        
/// 数据
        
/// </summary>
        public object Data { getset; }
        /// <summary>
        
/// 左子树
        
/// </summary>
        public TreeNode Left { getset; }
        /// <summary>
        
/// 右子树
        
/// </summary>
        public TreeNode Right { getset; }
    }
    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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值