plina

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
二叉树的三种遍历方式
Public class Tree
    {
        public int value;
        public Tree Left;
        public Tree Right;
    }
    class Program
    {
        public static void PreOrder(Tree Tree)//前序遍历
        {
            int value = Tree.value;
            Console.WriteLine(value.ToString());
            if (Tree.Left != null)
                PreOrder(Tree.Left);
            if (Tree.Right != null)
                PreOrder(Tree.Right);
        }
        public static void InOrder(Tree Tree) // 中序遍历
        {
            if (Tree.Left != null)
                InOrder(Tree.Left);
            int value = Tree.value;
            Console.WriteLine(value.ToString());
            if (Tree.Right != null)
                InOrder(Tree.Right);
        }
        public static void PostOrder(Tree Tree) // 后序遍历
        {
            if (Tree.Left != null)
                PostOrder(Tree.Left);
            if (Tree.Right!= null)
                PostOrder(Tree.Right);
            int value = Tree.value;
            Console.WriteLine(value.ToString());
        }
        static void Main(string[] args)
        {
            Tree Tree = new Tree();
            Tree.value = 1;
            Tree.Left = new Tree() { value = 2, Left = new Tree() { value = 4, Right = new Tree() { value = 7 } } };
            Tree.Right = new Tree() { value = 3, Left = new Tree() { value = 5 }, Right = new Tree() { value = 6, Left = new Tree() { value = 8 } } };

            PreOrder(Tree);
            Console.WriteLine("\n\r");
            InOrder(Tree);
            Console.WriteLine("\n\r");
            PostOrder(Tree);
            Console.ReadLine();
        }
    }

 

如果不是用递归,可以通过压栈来完成

   public static void PreOrderNoRecursion(Tree tree)
        {
            if (tree == null)
                return;

            System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>();
            Tree node = tree;

            while (node != null || stack.Any())
            {
                if (node != null)
                {
                    stack.Push(node); 
                    System.Console.WriteLine(node.value.ToString());
                    node = node.Left;
                }
                else
                {
                    var item = stack.Pop();
                    node = item.Right;
                }
            }
        }
        public static void InOrderNoRecursion(Tree tree)
        {
            if (tree == null)
                return;

            System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>();
            Tree node = tree;
            while (node != null || stack.Any())
            {
                if (node != null)
                {
                    stack.Push(node);
                    node = node.Left;
                }
                else
                {
                    var item = stack.Pop();
                    System.Console.WriteLine(item.value.ToString());
                    node = item.Right;
                }
            }
        }
        public static void PostOrderNoRecursion(Tree tree)
        {
            if (tree == null)
                return;

            System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>();
            Tree node = tree;
            Tree pre = null;
            stack.Push(node);

            while (stack.Any())
            {
                node = stack.Peek();
                if ((node.Left == null && node.Right == null) ||
                    (pre != null && (pre == node.Left || pre == node.Right)))
                {
                    System.Console.WriteLine(node.value);
                    pre = node;
                    stack.Pop();
                }
                else
                {
                    if (node.Right != null)
                        stack.Push(node.Right);

                    if (node.Left != null)
                        stack.Push(node.Left);
                }
            }
        }
View Code

 


 

posted on 2017-08-08 16:01  plina  阅读(180)  评论(0编辑  收藏  举报