二叉树先序遍历,中序遍历和后序遍历的非递归实现

原创 2015年07月10日 10:34:24

常用的一些数据结构操作的实现,记录下来,便于以后查阅

二叉树先序遍历

       void PreOrder(BitTree *T){
            BitTree *p;
            p=T;
            stack<BitTree *> s;
            while(!s.empty()||p){
               if(p){
               	   s.push(p);
                   cout<<p->val<<endl;//先序遍历
                   p=p->left;
               }
	       else{
                   p=s.top();
                   s.pop();//这里先获得栈中顶部元素,然后pop顶部元素
                   p=p->right;
               }
            }
        }
二叉树中序遍历

       void InOrder(BitTree *T){
            BitTree *p;
            p=T;
            stack<BitTree *> s;
            while(!s.empty()||p){
               if(p){
               	   s.push(p);
                   p=p->left;
               }
	       else{
                   p=s.top();
                   cout<<p->val<<endl;//与先序遍历相比的区别在于访问节点顺序不同,中序遍历要先访问左节点
                   s.pop();
                   p=p->right;
               }
            }
        }
二叉树后序遍历

后序遍历要稍微复杂一些,涉及到右子树是否被访问过的问题,因为只有右孩子访问了,才能访问当前节点,否则不能将当前节点pop出栈

void InOrder(BitTree *T){
            BitTree *p;
            p=T;
            BitTree *preNode=NULL;
            stack<BitTree *> s;
            while(!s.empty()||p){
               while(p){
               	   s.push(p);
                   p=p->left;
               }
               p=s.top();
	       if(p->right==NULL||p->right==preNode)
                   s.pop();
                   cout<<p->val<<endl;
                   preNode=p;
                   p=NULL;
                   
               }
               else{
                    p=p->right;
                }
            }
        }


还有一种双栈法比较好实现,就是将后序遍历过程压入到另一个栈中,然后再遍历栈空间

void PostOrder(BiTree *T)  // 后序遍历的非递归     双栈法    
{      
    stack<BiTree *> s1 , s2;      
    BiTree *curr ;           // 指向当前要检查的节点    
    if(T)
 	s1.push(T);    
    while(!s1.empty())  // 栈空时结束      
    {    
        curr = s1.top();    
        s1.pop();    
        s2.push(curr);    
        if(curr->left)    
            s1.push(curr->left);    
        if(curr->right)    
            s1.push(curr->right);    
    }    
    while(!s2.empty())    
    {    
        cout<<s2.top()->val<<endl;    
        s2.pop();    
    }    
} 







相关文章推荐

二叉树的后序非递归遍历(双栈法)

Alternative Solution: An alternative solution is to use two stacks. Try to work it out on a piece of...
  • tkp2014
  • tkp2014
  • 2015年09月14日 16:43
  • 873

先序遍历、中序遍历二叉树非递归实现

leetcode 94. Binary Tree Inorder Traversal/** * Definition for a binary tree node. * struct TreeNo...

二叉树的先序遍历、中序遍历、后序遍历、层次遍历的递归实现

#include #include #include #define MAX 20 #define OK 1 #define ERROR 0 #define NULL 0 #define OVE...

二叉树先序遍历 -- 递归和非递归实现

/* *实现二叉树先序遍历 -- 采用递归和非递归方法,经调试可直接运行源码如下: */ #include #include #include #include using namespace ...

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

二叉树是数据结构里经常使用的一种数据结构,需要注意其和树的区别(二叉树的一个节点最多只能有2个子树,而树没这个限制),还有完全二叉树和满二叉树。 创建如下图的一颗二叉树:一、创建二叉树public ...

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

二叉树1 非递归前序遍历二叉树1.1 递归前序遍历二叉树 按照教科书上的做法,前序遍历过程如下:先访问根节点,再访问左节点,再访问右节点 另一种访问方式为:按照图中红线的轨迹,第一次遇到的节点即为前...

二叉树先序中序后序遍历的非递归实现A

遍历二叉树的递归程序void Traverse(BiTree T) { if(T) { //visit,先序遍历 Traverse(T->lchild); ...

二叉树的先序、中序、后序遍历的非递归实现

首先定义树的结点,创建树,再进行树的遍历的非递归实现 #include #include using namespace std; //树节点定义 typedef struct node { s...

非递归实现二叉树的前序,中序,后序遍历打印

前言:前面这篇文章主要是用递归的思想写了一颗二叉树,其中包括前序建树;前序,中序,后序遍历打印,层序遍历(非递归);求高度;求节点数;求叶子节点数;求第k层结点树等;详情请看: 递归实现二叉树的前,...

二叉树先序、中序、后序遍历的非递归实现

在网上看了一些用非递归实现先序中序后序遍历二叉树的代码,都很混乱,while、if各种组合嵌套使用,逻辑十分不清晰,把我也搞懵了。想了大半天,写了大半天,突然开了窍,实际上二叉树的这三种遍历在逻辑上是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树先序遍历,中序遍历和后序遍历的非递归实现
举报原因:
原因补充:

(最多只允许输入30个字)