• 二叉树


    二叉树的三种遍历方式
    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("
    
    ");
                InOrder(Tree);
                Console.WriteLine("
    
    ");
                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


     

  • 相关阅读:
    [haoi2015]T1
    [haoi2014]走出金字塔
    [haoi2014]穿越封锁线
    [haoi2014]遥感监测
    [haoi2012]高速公路
    [haoi2012]容易题
    [haoi2008]排名系统
    【bzoj1014】[JSOI2008]火星人prefix
    0916解题报告
    生成树计数问题
  • 原文地址:https://www.cnblogs.com/lemonP/p/7307315.html
Copyright © 2020-2023  润新知