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();

代碼:http://download.csdn.net/detail/luozuolincool/7931305
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章