二叉树 层序、前序、中序、后序遍历。

简单二叉树

    public  class Node<T>
    {
        private T _data;
        private Node<T> _leftChild;
        private Node<T> _rightChild;
        private Node<T> _Parent;
        private int flag;
        public  Node(){}

        public Node(T data) { this._data = data; flag = 0; }

        public override string ToString()
        {
            return _data.ToString();
        }
        public T Data { get { return _data; } set { _data = value; } }
        public  Node<T> LeftChild { get { return _leftChild==null?null:_leftChild; } set { _leftChild = value; } }
        public Node<T> RightChild { get { return _rightChild==null?null:_rightChild; } set { _rightChild = value; } }
        public Node<T> Parent { get { return _Parent==null?null:_Parent; } set { _Parent = value; } }
        public int Flag { get { return flag; } set { flag = value; } }
    }
    class BinaryTree<T>
    {
        private Node<T> _root;
        public BinaryTree() { }
        public BinaryTree(Node<T> node) { this._root = node; }
        //四种序列
        public Node<T> Root { get { return _root; } set { this._root = value; } }
    }

层序遍历

        public void ByLayerPrint()
        {
            Node<T> temp = new Node<T>();
            Queue<Node<T>> queue = new Queue<Node<T>>();
            queue.Enqueue(_root);
            while (queue.Count > 0)
            {
                temp = queue.Dequeue();
                Console.WriteLine(temp);
                if (temp.LeftChild != null) { queue.Enqueue(temp.LeftChild); }
                if (temp.RightChild != null) { queue.Enqueue(temp.RightChild); }
            }
        }

前序遍历

  public void PreOrderPrint()
        {
            Node<T> temp = new Node<T>();
            Stack<Node<T>> stack = new Stack<Node<T>>();
            temp = _root;
            while (temp != null || stack.Count > 0)
            {
                while (temp != null)
                {
                    Console.WriteLine(temp);
                    stack.Push(temp);
                    temp = temp.LeftChild;
                }

                if (stack.Count > 0)
                {
                    temp = stack.Pop();
                    temp = temp.RightChild;
                }
            }
        }

中序遍历

 public void InOrderPrint()
        {
            Node<T> temp = new Node<T>();
            Stack<Node<T>> stack = new Stack<Node<T>>();
            temp = _root;
            while (temp != null)
            {
                stack.Push(temp);
                temp = temp.LeftChild;
            }
            while (stack.Count > 0)
            {
                temp = stack.Pop();
                Console.WriteLine(temp);
                if (temp.RightChild != null) { stack.Push(temp.RightChild); }
            }
        }

后序遍历

 public void PostOrderPrint()
        {
            Node<T> temp = new Node<T>();
            Stack<Node<T>> stack = new Stack<Node<T>>();
            temp = _root;
            while (temp != null)
            {
                stack.Push(temp);
                temp = temp.LeftChild;
            }

            while (stack.Count > 0)
            {
                temp = stack.Peek();
                if (temp.RightChild == null || temp.RightChild.Flag == 1)
                {
                    stack.Pop();
                    Console.WriteLine(temp);
                    temp.Flag = 1;
                }
                else
                {
                    temp.Flag = 0;
                    temp = temp.RightChild;
                    while (temp != null)
                    {
                        stack.Push(temp);
                        temp = temp.LeftChild;
                    }
                }
            }
        }

测试代码

        static void Main(string[] args)
        {
            Node<string> node = new Node<string>("aaa");
            Node<string> node2 = new Node<string>("bbb");
            Node<string> node3 = new Node<string>("ccc");
            Node<string> node4 = new Node<string>("ddd");
            Node<string> node5 = new Node<string>("eee");
            Node<string> node6 = new Node<string>("fff");
            Node<string> node7 = new Node<string>("ggg");
            Node<string> node8 = new Node<string>("hhh");

            BinaryTree<string> tree = new BinaryTree<string>(node);
            node.LeftChild = node5;
            node.RightChild = node4;
            node4.RightChild = node3;
            node5.RightChild = node6;
            node5.LeftChild = node7;
            Console.WriteLine("******************************");
            Console.WriteLine("******* 层序遍历  1 **********");
            Console.WriteLine("******* 前序遍历  2 **********");
            Console.WriteLine("******* 中序遍历  3 **********");
            Console.WriteLine("******* 后序遍历  4 **********");
            Console.WriteLine("******* 退出      0 **********");
            Console.WriteLine("******************************");
            while (true)
            {
                ConsoleKeyInfo key = Console.ReadKey();
                switch (key.Key)
                {
                    case ConsoleKey.D0:
                        Environment.Exit(0);
                        break;
                    case ConsoleKey.D1:
                        Console.WriteLine("---------层序遍历----------");
                        tree.ByLayerPrint();
                        break;
                    case ConsoleKey.D2:
                        Console.WriteLine("---------前序遍历----------");
                        tree.PreOrderPrint();
                        break;
                    case ConsoleKey.D3:
                        Console.WriteLine("---------中序遍历----------");
                        tree.InOrderPrint();
                        break;
                    case ConsoleKey.D4:
                        Console.WriteLine("---------后序遍历----------");
                        tree.PostOrderPrint();
                        break;
                    default:
                        Console.WriteLine("输入有误,重新输入");
                        break;
                }

            }
        }

测试结果

时间: 2024-10-23 10:49:21

二叉树 层序、前序、中序、后序遍历。的相关文章

分别求二叉树前、中、后序的第k个节点

一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 int n=1; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' '; if(n==k) return root->data; n++; elemType ch = preNode(root->lchild,k); if(ch!=' ') return ch; ch = preNode(root->rchild,k); return ch;

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的基础性质及二叉树的建立参见前面两篇博文: http://blog.csdn.net/why850901938/article/details/51052936 http://blog.csdn.net/why850901938/article/details/51052156 首先为了讲解方便,我建立了如图所示的二叉树: 取名为:树A 1.何为层序遍历? 层序遍历就是按照二叉树的层次由上到下的进行遍历,每一层要求访问的顺序为从左到右: 以树A为例,层序遍历得到的结果为: 5 2 6 1

已知二叉树前、中序遍历,求后序 / 已知二叉树中、后序遍历,求前序

void solve(int start,int end,int root) { // 前序和中序 -> 后序 // 每次调用solve()函数,传入pre-order的start,end,root if (start > end) // 递归边界 return; int i = start; while (i < end && in.at(i) != pre.at(root)) // 找到左右子树的分割点 i++; solve(start, i - 1, root +

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

日常学习随笔-用链表的形式实现普通二叉树的新增、查找、遍历(前、中、后序)等基础功能(侧重源码+说明)

一.二叉树 1.二叉树的概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree),其次序不能任意颠倒. 2.性质 (1)若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0): (2)高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1). (空树的高度为-1): (3)对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n,

算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } 一个数组的MaxTree定义如下: ◆ 数组必须没有重复元素 ◆ MaxTree是一颗二叉树,数组的每一个值对应一

二叉树的先序-中序-后序遍历(一)-循环----绝对白痴好记的方法

接着上一篇 二叉树的先序-中序-后序遍历(一)-递归 的讲,这篇该循环遍历了. 之前一直没有找到好的方法来循环遍历树,以前我老认为有些递归的能做的东西很难换成循环实现. 后来看了一些别人写的代码,然后又问了朋友,才发现...哦,原来这样的啊,我可以自己弄个栈来维护一下. 想到了可以弄个栈以后,至少在我认为,把递归转成循环已经是可行的了,至于怎么实现,这几天在想(因为太笨,看人家的代码总看一半就不想看),今天找到了一个好用的方法,在这里分享一下. 算法的核心是:你看二叉树的时候心里怎么想的,程序就

前序中序后序遍历非递归实现

#include<iostream> #include<vector> #include<stack> #include<string> #include<algorithm> #include<numeric> using namespace std; class node{ public: int val; node* left; node* right; node():val(0),left(NULL),right(NULL){