您的位置:首页 > 其它

二叉树遍历算法和源码

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
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: