C# 二叉樹遍曆

來源:互聯網
上載者:User

標籤:二叉樹   遍曆   c#   

C#  二叉樹遍曆C#完成的二叉樹遞迴和非遞迴的遍曆。BTreeNode是節點類,Visited是ENUM類型的表示當前節點是否被訪問以及被訪問的是左孩子還是右孩子(非遞迴後序遍曆用到)BTree是二叉樹類,preVisit,InVisit,BackVisit分別是遞迴的前中後序遍曆,preVisit1,InVisit1,BackVisit1分別是 非遞迴的前中後序遍曆
 public enum Visited
    {
        none,
        left,
        right
    }
  public  class BTreeNode
    {
       public BTreeNode left;
       public BTreeNode right;
       public int data;
       public  Visited visited;
    }
public class BTree
    {
       public  BTreeNode btreenode;
       public Stack<BTreeNode> NodeStack=new Stack<BTreeNode>();
        public BTree(BTreeNode node)
        {
            this.btreenode = node;
        }
        public void preVisit(BTreeNode node)
        {            
            visit(node);
            if (node != null)
            {
                preVisit(node.left);
                preVisit(node.right);
            }
        }
        public void InVisit(BTreeNode node)
        {
            if (node != null)
                InVisit(node.left);
            visit(node);
            if (node != null)
                InVisit(node.right);
        }
        public void BackVisit(BTreeNode node)
        {
            if (node != null)
            {
                BackVisit(node.left);
                BackVisit(node.right);
            }
            visit(node);
        }
        public void preVisit1(BTreeNode node)
        {
            while (node != null || NodeStack.Count > 0)
            {
                if (node == null)
                {
                    node = NodeStack.Pop();
                    if (node.right != null)
                    {
                        visit(node.right);
                        NodeStack.Push(node.right);
                    }
                    node = null;
                }
                else
                {
                    visit(node);
                    NodeStack.Push(node);
                    node = node.left;
                }
            }
        }     
        public void InVisit1(BTreeNode node)
        {
            while (node != null || NodeStack.Count > 0)
            {
                if (node == null)
                {
                    node = NodeStack.Pop();
                    visit(node);
                    if (node.right != null)
                    {
                        NodeStack.Push(node.right);
                    }
                    node = null;
                }
                else
                {
                    NodeStack.Push(node);
                    node = node.left;
                }
            }
        }       
        public void BackVisit1(BTreeNode node)
        {
            while (node != null || NodeStack.Count>0)
            {
                if (node == null)
                    node = NodeStack.Peek();
                if (node.visited == Visited.none)
                {
                    node.visited = Visited.left;
                    NodeStack.Push(node);
                    node = node.left;
                }
                else if (node.visited == Visited.left)
                {
                    node.visited = Visited.right;
                    NodeStack.Pop();
                    NodeStack.Push(node);
                    node = node.right;
                }
                else if (node.visited == Visited.right)
                {
                    visit(node);
                    NodeStack.Pop();
                    node = null;
                }
            }
        }
        private void visit(BTreeNode node)
        {
            if(node!=null)
                Console.Out.Write(" "+node.data);
        }


    }
下面是構造樹以及測試的方法: BTreeNode node1 = new BTreeNode();
            node1.data = 3;
            node1.visited = Visited.none;
            BTreeNode node2 = new BTreeNode();
            node2.data = 4;
            node2.visited = Visited.none;
            BTreeNode node3 = new BTreeNode();
            node3.data = 7;
            node3.visited = Visited.none;
            BTreeNode node4 = new BTreeNode();
            node4.data = 5;
            node4.visited = Visited.none;
            BTreeNode node5 = new BTreeNode();
            node5.data = 2;
            node5.visited = Visited.none;
            BTreeNode node6 = new BTreeNode();
            node6.data = 9;
            node6.visited = Visited.none;
            node1.left = node2;
            node1.right = node3;
            node2.left = node4;
            node2.right = node5;
            node3.right = node6;
            BTree btree = new BTree(node1);
            Console.Write("  前序遞迴遍曆:");
            btree.preVisit(btree.btreenode);
            Console.WriteLine("");
            Console.Write("前序非遞迴遍曆:");
            btree.preVisit1(btree.btreenode);
            Console.WriteLine("");


            Console.Write("  中序遞迴遍曆:");
            btree.InVisit(btree.btreenode);
            Console.WriteLine("");
            Console.Write("中序非遞迴遍曆:");
            btree.InVisit1(btree.btreenode);
            Console.WriteLine("");


            Console.Write("  後序遞迴遍曆:");
            btree.BackVisit(btree.btreenode);
            Console.WriteLine("");
            Console.Write("後序非遞迴遍曆:");
            btree.BackVisit1(btree.btreenode);
            Console.WriteLine("");
            Console.Read();


C# 二叉樹遍曆

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.