二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)

 1 typedef struct TreeNode *BinTree;
 2 typedef    BinTree Position;
 3 struct TreeNode{
 4     ElementType Data;
 5     BinTree Left;
 6     BinTree Right;
 7 };
 8 BinTree BT;
 9 void InOrderTraversal(BinTree BT)//中序遍历非递归遍历算法(使用堆栈,用循环实现)
10 {
11     BinTree T=BT;
12     Stack S=CreakStack(MaxSize);//创建并初始化堆栈S
13     while(T||!IsEmpty(S)){
14         while(T){//一直向左并将沿途结点压入堆栈
15             Push(S,T);
16             T=T->Left;
17         }
18         if(!IsEmpty(S)){
19             T=Pop(S);//结点弹出堆栈
20             printf("%5d",T->Data);//(访问)打印结点
21             T=T->Right;//转向右子树
22         }
23     }
24 }
25 void PreOrderTraversal(BinTree BT)//先序遍历非递归遍历算法(使用堆栈,用循环实现)
26 {
27     BinTree T=BT;
28     Stack S=CreakStack(MaxSize);//创建并初始化堆栈S
29     while(T||!IsEmpty(S)){
30         while(T){//一直向左并将沿途结点压入堆栈
31             printf("%5d",T->Data);//(访问)打印结点
32             Push(S,T);
33             T=T->Left;
34         }
35         if(!IsEmpty(S)){
36             T=Pop(S);//结点弹出堆栈
37             T=T->Right;//转向右子树
38         }
39     }
40 }
41 void PostOrderTraversal( BinTree BT )//后序遍历非递归遍历算法(使用堆栈,用循环实现)
42 {
43    BinTree T BT;
44    Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/
45    Stack Q = CreatStack( MaxSize ); /*创建并初始化堆栈Q,用于输出反向*/
46    while( T || !IsEmpty(S) ){
47        while(T){ /*一直向右并将沿途结点压入堆栈*/
48            Push(S,T);
49            Push(Q,T);/*将遍历到的结点压栈,用于反向*/
50            T = T->Right;
51        }
52        if(!IsEmpty(S)){
53        T = Pop(S); /*结点弹出堆栈*/
54        T = T->Left; /*转向左子树*/
55        }
56    }
57    while( !IsEmpty(Q) ){
58        T = Pop(Q);
59        printf(“%5d”, T->Data); /*(访问)打印结点*/
60    }
61 } 
时间: 2024-11-08 00:20:41

二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)的相关文章

c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)

二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 4,层级遍历 二叉树的查找,求高度,求个数,求父节点,复制二叉树,释放二叉树 编译方法,用gcc编译不过去,用g++编译,命令如下: g++ -g nodestack.c nodequeue.c bintree.c

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的递归遍历实现起来比较简单,而且代码简洁:而非递归遍历则不那么简单,我们需要利用另一种数据结构---栈来实现.二叉树的遍历又可以分为前序.中序和后序三种,它们是按照根结点在遍历时的位置划分的,前序遍历则根结点先被遍历,中序则根结点在左右叶子节点之间被遍历,后序则是根结点最后被遍历.三种非递归遍历中,前序和中序都不是太复制,而后序遍历则相对较难. 一.前序遍历 我们这里前序遍历按照"根-左-右"的顺序来遍历.这里按照"递归--非递归"的次序来研究,之后的几种亦是

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

非递归遍历二叉树利用栈的先进先出特点完成实现 前序比较好理解先压根入栈,在while里面访问根,根出栈,再压入右子树,左子树,这样的遍历二叉树就是前序遍历了. void PrevOrdr_NonR() { stack<BinaryTreeNode<T>*> s; s.push(_root); while(!s.empty()) { BinaryTreeNode<T>* top = s.top(); s.pop(); cout<<top->_data&l

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简单,后序遍历最难.我们的讨论基础是这样的: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode; 首先,有一点是明确的:非递归

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

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

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

二叉树的非递归遍历(先序、中序、后序和层序遍历)

[前文] 二叉树的非递归遍历有 先序遍历.中序遍历 .后续遍历 和 层序遍历. 非递归算法实现的基本思路:使用堆栈.而层序遍历的实现:使用队列. 如下图所示的二叉树: 前序遍历顺序为:ABCDE (先访问根节点,然后先序遍历其左子树,最后先序遍历其右子树) 中序遍历顺序为:CBDAE (先中序遍历其左子树,然后访问很节点,最后中序遍历其右子树) 后续遍历顺序为:CDBEA (先后序遍历其左子树,然后后续其右子树,最后访问根节点) 层序遍历顺序为:ABECD (由上至下.从左到右遍历二叉树) [准

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav

先序序列和后序序列并不能唯一确定二叉树

数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树.显然,这三种组合并不是都能唯一确定二叉树的,其中先序+后序就不能唯一确定一棵二叉树,其他两种组合可以唯一的确定一颗二叉树. 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 反例:任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不