C#数据结构中的二叉树




class MyTree

    {
        public MyTree(char node)
        {
            Node = node;


        }
        public char Node;
        public MyTree lefttree;
        public MyTree righttree;

    }


 //递归的先序遍历
        private static void pre_view_recur(MyTree mt)
        { 
         if(mt!=null)
         {
             Console.Write(mt.Node);
             pre_view_recur(mt.lefttree);
             pre_view_recur(mt.righttree);
         }
        }


        //非递归的先序遍历
        private static void pre_view_none_recur(MyTree mt)
        { 
            //判断是否为空
            if(mt==null)
            {
                return;
            }
            //定义一个栈
            Stack<MyTree> mtStack = new Stack<MyTree>();
            //当二叉树还有元素并且栈不为空时
            while(mt!=null || mtStack.Any())
            {
                //如果二叉树不为空,说明可以向左遍历
                if (mt != null)
                {
                    Console.Write(mt.Node); 
                    mtStack.Push(mt); //将子树入栈
                    mt = mt.lefttree;//向左遍历
                }
                else //为空说明左边遍历完了,退回一步,将上一个节点赋给新的子树
                {
                    mt=mtStack.Pop();
                    mt = mt.righttree; //向右遍历
                }
            }
        }




        //递归方法处理:中序遍历
        private static void mdi_view_recur(MyTree mt)
        { 
          if(mt!=null)
          {
              mdi_view_recur(mt.lefttree);
              Console.Write(mt.Node);
              mdi_view_recur(mt.righttree);
          }
        }


        //非递归实现:中序遍历
        private static void mdi_view_none_recur(MyTree mt)
        { 
            if(mt==null)
            {
                return;
            }
            Stack<MyTree> mtStack = new Stack<MyTree>();


            while(mt!=null || mtStack.Any())
            {
                if (mt!= null)
                {
                    mtStack.Push(mt);
                    mt = mt.lefttree;
                }
                else
                {
                    mt=mtStack.Pop();
                    Console.Write(mt.Node);
                    mt = mt.righttree;
                }
              
            }
        }


        //递归实现后序遍历
        private static void last_view_recur(MyTree mt)
        { 
          if(mt!=null)
          {
              last_view_recur(mt.lefttree);
              last_view_recur(mt.righttree);
              Console.Write(mt.Node);
          }
        }

//非递归实现后序遍历

后序遍历可以看作是下面遍历的逆过程:即先遍历某个结点,然后遍历其右孩子,然后遍历其左孩子。这个过程逆过来就是后序遍历。


        private static void last_view_none_recur(MyTree mt)
        {
            //进栈顺序为根、右、左只有这样才能出栈变为左右中
            //当左右子树均没有,或者左子树已经访问完,再访问右子树,当左右子树都访问完时,在访问根
            MyTree preTree = null;//定义一个编辑位
            MyTree nowTree = null;//定义正在访问的节点
            Stack<MyTree> mtStack = new Stack<MyTree>();
            mtStack.Push(mt);
            while (mtStack.Any())
            {
                nowTree = mtStack.Peek();
                //如果当前左右子树为0,或者标记位不为空,并且是现在节点的左右子树
                if ((nowTree.lefttree == null && nowTree.righttree == null) ||
                    (preTree != null && (preTree == nowTree.lefttree || preTree == nowTree.righttree)))
                {
                    Console.Write(nowTree.Node);
                    preTree=mtStack.Pop();
                }
                else
                {
                    if (nowTree.righttree != null)
                    {
                        mtStack.Push(nowTree.righttree);
                    }
                    if (nowTree.lefttree != null)
                    {
                        mtStack.Push(nowTree.lefttree);
                    }
                }
            }
        }


 //层次遍历 利用队列实现,根节点进入队列中,然后输出,再左右进入,循环
        private static void cengci_view(MyTree mt)
        {
            Queue<MyTree> mtQueue = new Queue<MyTree>();
            mtQueue.Enqueue(mt);
            while(mtQueue.Any())
            {
                mt = mtQueue.Dequeue();
                if(mt!=null)
                {
                    Console.Write(mt.Node);
                }
                if(mt.lefttree!=null)
                {
                    mtQueue.Enqueue(mt.lefttree);
                }
                if(mt.righttree!=null)
                {
                    mtQueue.Enqueue(mt.righttree);
                }
            }
        }


实现过程:

  MyTree tree = new MyTree('A');
            tree.lefttree = new MyTree('B');
            tree.lefttree.lefttree = new MyTree('D');
            tree.lefttree.lefttree.lefttree = new MyTree('G');
            tree.lefttree.righttree = new MyTree('E');
            tree.lefttree.righttree.righttree = new MyTree('H');


            tree.righttree = new MyTree('C');
            tree.righttree.righttree = new MyTree('F');


            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("前序遍历1:");
            pre_view_recur(tree);


            Console.WriteLine();
            Console.Write("前序遍历2:");
            pre_view_none_recur(tree);


            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.White;
            Console.Write("中序遍历1:");
            mdi_view_recur(tree);
            Console.WriteLine();
            Console.Write("中序遍历2:");
            mdi_view_none_recur(tree);


            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("后序遍历1:");
            last_view_recur(tree);
            Console.WriteLine();
            Console.Write("后序遍历2:");
            last_view_none_recur(tree);


            // last_view_none_recur(tree);


            Console.WriteLine();
            Console.Write("层次遍历:");
            Console.BackgroundColor = ConsoleColor.Gray;
            cengci_view(tree);








            Console.Read();



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值