C++用非递归实现二叉树的前序排列,中序排列,后续排列

前序排列的非递归实现:
   Template<class T>
Void PreOrder(BinaryTreeNode<T> *t)
  {
    stack <BinaryTreeNode<T> *> S(Maxlength);
     BinaryTreeNode<T> *p=t;
 do{
      while(p){
                 visit(p);//访问P
                  S.Add(p);
                  p=p->LeftChild;
              }
      If(!S.IsEmpty()){
         S.Delete(p);
         p=p->RightChild;
              }
  }while(p||!S.IsEmpty())
}

中序排列的非递归实现:
template<class T>
void InOrder(BinaryTreeNode<T> *t)     //对*t进行中序遍历
{  	stack  <BinaryTreeNode<T> *>   S(MaxLength);
    BinaryTreeNode<T> *p=t ;
   do {
		while (p)
                 {S.Add(p);   p=p->LeftChild;}
		  if (!S.IsEmpty())
                    {S.Delete(p);
                      Visit(p);
		           p=p->RightChild;
                     }
	  } while (p||!S.IsEmpty())
}
后续排列的非递归实现:
template<class T>
void PostOrder(BinaryTreeNode<T> *t)
{  	stack  <BinaryTreeNode<T> *>   S(MaxLength);
    BinaryTreeNode<T> *p=t ;
   do {
		while (p)
              {S.Add(p); p=p->LeftChild;}
		  if (!S.IsEmpty())
       {
                    If(p->RightChild){
                    S.Delete(p);
                    S.Add(p);S.Add(p->RightChild);p=p->RightChild;}
      else{ S.Delete(p);visit(p);}

		                                }
	  } while (p||!S.IsEmpty())
}

时间: 2024-08-08 13:52:19

C++用非递归实现二叉树的前序排列,中序排列,后续排列的相关文章

非递归求二叉树的前序、中序和后序遍历

一.前序遍历 分析: 1.前序遍历是中左右,因此利用栈,记录栈顶根结点的同时,先压右子树,后压左子树,从而先遍历左子树. 2.每次弹出的栈顶结点符合前序遍历的顺序,因此可直接记录. 3.注意:由于压入栈的是树的结点,所以栈内数据类型为Node*. struct Node{ int val; Node *left, *right; }; vector<int> get_preorder(Node *root){ vector<int> preorder; stack<Node*

二叉树的前序,中序及后续遍历

前序遍历:先访问跟结点,然后遍历左子树,最后遍历右子树.即"根左右". 实现代码: class Solution { public: vector<int> preorderTraversal(TreeNode *root) { if (root==NULL) { return vector<int>(); } vector<int> result; stack<TreeNode *> treeStack; treeStack.push(

二叉树的前序、中序、后序遍历的递归和非递归算法实现

1 /** 2 * 二叉树的前序.中序.后序遍历的递归和非递归算法实现 3 **/ 4 5 //二叉链表存储 6 struct BTNode 7 { 8 struct BTNode *LChild; // 指向左孩子指针 9 ELEMENTTYPE data; // 结点数据 10 struct BTNode *RChild; // 指向右孩子指针 11 }; 12 13 /** 14 * 前序遍历 15 **/ 16 // 递归实现 17 void PreorderTraversal(BTNo

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. 可以和(编程训练)再回首,数据结构--二叉树的前序.中序.后序遍历(递归)对比着看 [问题描述] 根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序.中序.后序遍历. [基本要求] ·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序.中序.后序遍历. ·输入:输入二叉树的顺序存储. ·输出:二叉树的先序.中序.后序遍历序

知道一棵二叉树的前序和中序序列求二叉树的后续序列

解析:由二叉树的前序和中序序列,先构建出二叉树,然后再进行后续递归遍历 注意递归停止的条件和相关的用法 源代码如下: #include<iostream> using namespace std; //定义一个二叉树的数据结构 typedef struct BiNode { char data; struct BiNode *lchild; struct BiNode *rchild; }BiNode,*BiTree; //后续递归遍历二叉树 void laterOrder(BiTree &a

二叉树的前序、中序、后序遍历迭代实现

二叉树的前序.中序.后序遍历迭代实现 二叉树的前序遍历,迭代实现 根-左-右 思路: 1. 借用栈的结构 2. 先push(root) 3. node = pop() 3.1.list.add( node.val ) 3.1.push( node.right ) 3.3.push( node.left ) 4.循环步骤3直到栈空 肯定很难理解,我们一步步执行下,请看图 我们来实现一下代码 public List<Integer> preorderTraversal(TreeNode root)

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

java实现线索化二叉树的前序、中序、后续的遍历(完整代码)

java实现线索化二叉树的前序.中序.后续的遍历 比如创建一个二叉树 1 / 3 6 / \ / 8 10 14 线索化二叉树几个概念: n个节点的二叉链表中含有n+1 [公式2n-(n-1)=n+1]个空指针域.利用二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继节点的指针(这种附加指针成为线索).如下面的就是6+1=7个空指针域 (8,10,14各有连个指针没有指向 6有一个) 加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树.分为前序线索二叉树.中序线索二叉树.

java 根据二叉树前序 ,中序求后续

在一棵二叉树总,前序遍历结果为:ABDGCEFH,中序遍历结果为:DGBAECHF,求后序遍历结果. 我们知道: 前序遍历方式为:根节点->左子树->右子树 中序遍历方式为:左子树->根节点->右子树 后序遍历方式为:左子树->右子树->根节点 从这里可以看出,前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右子树部分前序遍历结果.因此,通过这个分析,可以恢复这棵二叉树