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

原创 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();    
    }    
} 







算法:二叉树的先序遍历、中序遍历、后序遍历(递归及非递归方式)的java代码实现

首先来看一棵二叉树: 1、前序遍历: 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树...
  • jssongwei
  • jssongwei
  • 2016年03月03日 17:33
  • 6601

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

#include "stdafx.h" #include using namespace std; const int MAXSIZE = 20; //定义栈空间大小为20 stru...
  • htyurencaotang
  • htyurencaotang
  • 2013年10月07日 13:17
  • 4138

二叉树先序、中序、后续遍历递归以及非递归java实现

闲来无事,对二叉树的遍历做个总结,下面是使用java对二叉树遍历的各种实现,与大家分享 public class Main { /** * 递归先序遍历二叉树 * @author zhan...
  • u011824857
  • u011824857
  • 2016年09月21日 22:15
  • 1257

二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现

1.首先是关于二树结点的设计 typedef struct TreeNode *PtrToNode; typedef PtrToNode BinTree; struct TreeNode {    ...
  • cs_hmyy
  • cs_hmyy
  • 2015年10月04日 19:16
  • 495

14.二叉树 中序遍历 先序遍历 的非递归实现 以及 二叉树 的复制 及判断二叉树的等价性

//////////////////////////////////////// #include #include #include #include #include #define OK 0 #...
  • zhb_51666
  • zhb_51666
  • 2014年04月19日 11:51
  • 299

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

leetcode 94. Binary Tree Inorder Traversal/** * Definition for a binary tree node. * struct TreeNo...
  • simple_the_best
  • simple_the_best
  • 2016年09月30日 20:20
  • 534

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

#include #include #include #define MAX 20 #define OK 1 #define ERROR 0 #define NULL 0 #define OVE...
  • u012791742
  • u012791742
  • 2014年10月31日 09:54
  • 1386

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

/* *实现二叉树先序遍历 -- 采用递归和非递归方法,经调试可直接运行源码如下: */ #include #include #include #include using namespace ...
  • y396397735
  • y396397735
  • 2016年04月12日 21:07
  • 247

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

#include #include #include #include #include #define maxn 100 using namespace std; typedef str...
  • lfb637
  • lfb637
  • 2017年11月08日 17:46
  • 61

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

前言:前面这篇文章主要是用递归的思想写了一颗二叉树,其中包括前序建树;前序,中序,后序遍历打印,层序遍历(非递归);求高度;求节点数;求叶子节点数;求第k层结点树等;详情请看: 递归实现二叉树的前,...
  • gogogo_sky
  • gogogo_sky
  • 2017年04月12日 17:40
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树先序遍历,中序遍历和后序遍历的非递归实现
举报原因:
原因补充:

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