`
bbls
  • 浏览: 63250 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

前序遍历二叉树,中序遍历二叉树,后序遍历二叉树 c#实现

阅读更多

using System.Collections.Generic;
    using System.Collections;
    class BiTree
    {

       public BiTree leftChild;
        public BiTree rightChild;

        public object Data;

        public BiTree(object aData)
        {
            Data = aData;
        }

    }

    class TestUtil
    {

        public static void Main()
        {

            BiTree root = new BiTree("1");


            BiTree n1 = new BiTree("2");
            BiTree n2 = new BiTree("3");
            BiTree n3 = new BiTree("4");
            BiTree n4 = new BiTree("5");
            BiTree n5 = new BiTree("6");
            BiTree n6 = new BiTree("7");

            root.leftChild = n1;
            root.rightChild = n2;
            n1.leftChild = n3;
            n1.rightChild = n4;
            n2.leftChild = n5;
            n2.rightChild = n6;

            //PreTravelCur(root);
            Console.WriteLine("中序:");
            MidTravelStack(root);
            Console.WriteLine("前序:");
            PreTravelStack(root);
            Console.WriteLine("后序:");
            LastTravelStack(root);
            Console.Read();


        }

        /// <summary>
        /// 前序遍历,递归
        /// </summary>
        /// <param name="tree"></param>
        public static void PreTravelCur(BiTree tree)
        {
            if (tree != null)
            {
                Console.WriteLine(tree.Data);
                PreTravelCur(tree.leftChild);
                PreTravelCur(tree.rightChild);
            }
        }

        /// <summary>
        /// 中序遍历
        /// </summary>
        /// <param name="tree"></param>
        public static void MidTravelStack(BiTree tree)
        {
            if (tree == null)
            {
                return;
            }

            Stack<object> stack = new Stack<object>();

            BiTree p = tree;

            do
            {
                while (p != null)
                {
                    stack.Push(p);
                    p = p.leftChild;
                }
                p =(BiTree) stack.Pop();

                Console.WriteLine(p.Data);
                p = p.rightChild;

            } while (stack.Count > 0|| p != null);

        
        }

        /// <summary>
        /// 前序遍历
        /// </summary>
        /// <param name="tree"></param>
        public static void PreTravelStack(BiTree tree)
        {

            if (tree == null)
                return;
            Stack<object> stack = new Stack<object>();
            BiTree p = tree;


            do
            {
                while (p != null)
                {
                    Console.WriteLine(p.Data);
                    stack.Push(p);
                    p = p.leftChild;

                }
                p = (BiTree)stack.Pop();
                p = p.rightChild;


            } while (stack.Count > 0 || p != null);

        }

        /// <summary>
        /// 要用两个栈,比前两种复杂
        /// </summary>
        /// <param name="tree"></param>
        public static void LastTravelStack(BiTree tree)
        {

            if (tree == null)
                return;
            //放访问过的节点
            Stack<BiTree> stack1 = new Stack<BiTree>();
            //放节点是否访问过 标志
            Stack<bool> stackFlag = new Stack<bool>();

            BiTree p=tree;
            do
            {
                while (p != null)
                {
                    stack1.Push(p);
                    stackFlag.Push(false);
                    p = p.leftChild;
                }
               
                p = stack1.Pop();
                bool flag = stackFlag.Pop();

                //第一次访问
                if (!flag)
                {
                    stack1.Push(p);
                    stackFlag.Push(true);
                    p = p.rightChild;
                }//第二次访问 
                else
                {
                    Console.WriteLine(p.Data);
                    p = null;
                }


            }
            //栈不为空 或者 指针不为空
            while (stack1.Count > 0 || p != null);

        }
      
    }

分享到:
评论

相关推荐

    C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法

    遍历二叉树是访问树中所有节点的过程,通常有三种基本的遍历方法:前序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)和后序遍历(Postorder Traversal)。这些遍历方法在C#编程中有着广泛的应用,如...

    链式二叉树的中序创建、递归中序遍历、非递归堆栈中序遍历、中序销毁

    递归中序遍历是二叉树遍历的一种常见方法。它遵循以下步骤: 1. 如果当前节点为空,则返回。 2. 首先递归遍历左子树。 3. 访问当前节点。 4. 最后递归遍历右子树。 递归中序遍历的核心在于其分治策略,将问题分解为...

    无限级分类----改进前序遍历树

    在这个场景中,我们将讨论如何利用二叉树的数据结构来实现无限级分类,并重点探讨一种改进的前序遍历算法。 二叉树是最基本的树形数据结构之一,每个节点最多有两个子节点,分为左子节点和右子节点。在二叉树中,...

    二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历

    二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历、计算叶子节点数目和所有节点数目,使用队列实现二叉树的层次遍历.zip

    二叉树的建立

    二叉树的遍历是理解和操作二叉树的关键,主要分为三种方式:前序遍历、中序遍历和后序遍历。在给定的代码中,我们关注的是如何根据前序遍历(Preorder Traversal)和中序遍历(Inorder Traversal)的结果来重建一棵...

    遍历二叉树的4个非递归算法.rar_binary tree_二叉树_二叉树 非递归 遍历_递归_遍历 CSharp

    二叉树遍历是理解和操作二叉树的关键技能,通常包括三种主要的递归方法:前序遍历、中序遍历和后序遍历,以及一种非递归方法——层次遍历。本资源"遍历二叉树的4个非递归算法.rar"提供了C#语言实现的这四种非递归...

    C# Windows 遍历二叉树

    然后是遍历二叉树,常见的遍历方法有前序遍历、中序遍历和后序遍历。这些遍历方法在实现时都遵循特定的访问顺序。 1. 前序遍历(根-左-右): ```csharp void PreOrderTraversal(TreeNode&lt;T&gt; node) { if (node != ...

    二叉树 各种遍历算法 C#实现

    在计算机科学中,二叉树遍历是访问二叉树所有节点的一种方法,通常分为三种主要类型:前序遍历、中序遍历和后序遍历。这些遍历方法在解决许多问题时非常有用,如搜索、排序、表达式求值等。本文将详细介绍这三种遍历...

    C#用栈的方法写二叉树的前中后序遍历

    以上就是使用C#栈方法进行二叉树前序、中序和后序遍历的详细解释。在实际编程中,可以将这些方法填充完整,以完成对二叉树的遍历。这种方法避免了递归,对于深度较大的二叉树,可以减少函数调用的开销,提高性能。...

    二叉树的遍历 c#版

    本篇文章将深入探讨二叉树的前序遍历、中序遍历和后序遍历这三种主要的遍历方法,并结合C#编程语言进行实现。 1. **前序遍历**: 前序遍历的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。在C#中,可以使用递归或栈来实现...

    C语言实现二叉树的后序遍历(递归)

    二叉树的遍历是访问树中所有节点的过程,通常有三种遍历方式:前序遍历、中序遍历和后序遍历。 **后序遍历:** 后序遍历遵循“左-右-根”的顺序,即首先遍历左子树,然后遍历右子树,最后访问根节点。这种遍历方式...

    winform 二叉树遍历源码

    二叉树遍历是二叉树算法中的核心部分,它主要包括三种主要方法:前序遍历、中序遍历和后序遍历。这些遍历方法有各自的用途,例如复制树、打印树结构或进行特定的搜索操作。 1. **前序遍历**:这是最基本的遍历方式...

    数据结构C#二叉树的基本运算

    二叉树通常分为三种遍历方式:前序遍历、中序遍历和后序遍历。 1. 前序遍历:首先访问根节点,然后遍历左子树,最后遍历右子树。 2. 中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树。 3. 后序遍历:...

    二叉树实验代码cpp

    二叉树及其遍历实验报告代码 关于二叉树的创建,前序遍历,中序遍历,后序遍历,横向打印二叉树。 采用AB##C##方式输入,#代表(左or右)子树为空

    数据结构实验报告6-树-二叉树的遍历算法-实验内容及要求.docx

    `:用后序遍历算法遍历二叉树。 - `intLayerTraval(BiTree bt);`:层次遍历二叉树。 - `intinitQueue(BiTreeQueue bt_queue);`:初始化循环队列。 - `intenQueue(const BiTreeQueue Q, BiTree bt);`:二叉树节点入队...

    二叉树遍历序列.cpp

    二叉树遍历序列.cpp

    二叉树由先序中序得到后序,并画图(C#)

    本篇我们将讨论如何根据先序遍历和中序遍历来重建一个二叉树,并通过C#编程语言实现这一过程。 先序遍历(Preorder Traversal)的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。中序遍历(Inorder Traversal)的顺序是:左...

    树节点二叉树的遍历运算.doc

    除了递归方法,还可以使用栈来实现非递归的二叉树遍历,这种方法称为迭代。例如,前序遍历的迭代实现可以借助一个栈来辅助: 1. 将根节点压入栈。 2. 当栈不为空时,弹出栈顶节点并访问,然后将其右子节点和左子...

Global site tag (gtag.js) - Google Analytics