用非递归方式实现二叉树的前、中、后三种遍历方法
来源:互联网 发布:台湾学知出版社在哪 编辑:程序博客网 时间:2024/05/17 00:10
今天中午,看到论坛上有人求用C++实现创建二叉树,以及用栈的操作(非递归)实现对该二叉树的前、中、后三种遍历。刚好自己复习了一下二叉树,就帮忙写写吧。也算练练笔吧。
创建二叉树的设计:输入的时候是以数组的形式输进去的,然后通过void initBiTree(pNode& biTree, int iniArr[], int pos)函数建立二叉树。建立二叉树是利用递归建立的,每建完一个节点,在建立左节点和有节点之前,先判断该节点是否为空,如果为空则返回,否则就创建该节点的左右子节点。
前序遍历二叉树:这个比较简单,主要思想就是每访问完一个节点之后,就把该节点的右子节点和左子节点依次压入栈中。
中序遍历二叉树:比前序稍微难一点,首先把根节点压入栈中,进入循环,利用一个内部的嵌套循环遍历左节点,并把所有得到的左节点都压入栈中,直到空栈的时候,pop出一个空节点,然后在访问top,并将其pop掉,之后在得到一个新的top,并将该top的右节点压入栈中,然后再回到循环
后序遍历二叉树:这个相对来说是最难的,我也分析了蛮久才写出来的,伪代码如下:
1、初始化两个节点top,child都为NULL,top为当前的栈顶,child为上次访问过的节点
2、 在根节点不为空的情况下,首先压入根节点;
3、while(栈不为空)
{
3.1 获取栈的top节点
3.2 if(top->lchild和top->rchild都为NULL),说明到了一个终节点,于是visit(top)然后设置child=top,pop掉top;并continue;
3.3 if(top->lchild等于child),说明top的左子树已经被访问过,因此要判断是有子树是否为空,如果不为空,则压入栈中,否则visit(top),并设置child=top,pop掉top
3.4else if(top->rchild等于child),说明top的右子树已经被访问过,因此,下一个访问的必定为top节点,于是直接visit(top),并设置child=top,pop掉top
3.5else(child并不是top的左子树,也不是child的右子树),说明top这棵树还没有被访问过,于是
3.5.1while(top->lchild不等于NULL)
{
将top->lchild压入栈中,并设置top = top->lchild;
}
}
具体代码如下,并没有写释放内存的函数:
测试数据如下:
开始输入的是一个整形数组,注意数组的输入一定要可以构成二叉树,否者只构造能形成二叉树的部分。
第一个输入代表数组的个数,0表示空
例如:
6
1 2 3 4 5 6
前序遍历结果:
1 2 4 5 3 6
中序遍历结果:
4 2 5 1 6 3
后序遍历结果:
4 5 2 6 3 1
11
1 2 3 0 4 5 6 0 0 7 8
前序遍历结果:
1 2 4 7 8 3 5 6
中序遍历结果:
2 7 4 8 1 5 3 6
后序遍历结果:
7 8 4 2 5 6 3 1
- 用非递归方式实现二叉树的前、中、后三种遍历方法
- 二叉树的遍历 前序 中序 后序 分别实现递归和非递归遍历方式
- 请用递归和非递归俩种方法实现二叉树的前序遍历。
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 二叉树的前序、中序、后序三种遍历的六种实现方式(递归、非递归)(C++)
- 以二叉树的前序遍历为例,递归和非递归方式的实现
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- 数据结构学习笔记-二叉树的前、中、后序遍历,递归、非递归方式
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 递归和非递归俩种方法实现二叉树的前序、中序、后续遍历
- 用java实现二叉树非递归的前序,中序,后序遍历算法
- 43.递归和非递归俩种方法实现二叉树的前序遍历。
- 递归和非递归俩种方法实现二叉树的前序遍历
- 递归和非递归俩种方法实现二叉树的前序遍历
- 二叉树非递归前、中、后序遍历实现
- 二叉树的实现&&递归和非递归方式前序、中序、后续遍历&&发现一个节点中序遍历的下一节点
- 利用开源的 Apache Solr 搜索引擎构建 RESTful 基础存储服务
- hdoj 2084(数塔)
- Red Hat Linux系统下SVN Server环境的构建
- vim显示行号、语法高亮、自动缩进,编译的设置
- js滑动图片菜单
- 用非递归方式实现二叉树的前、中、后三种遍历方法
- LINK : fatal error LNK1000: Internal error during IncrBuildImage
- 游戏引擎基础(一)(渲染和构造3D世界)
- Red Hat EnterPrise linux5下安装Oracle 9i
- 游戏引擎基础(二)(3D环境的光照和纹理)
- linux网络编程SO_REUSEADDR
- 动画片
- 图片压缩后,依然很大的解决方案
- 游戏引擎基础(三)(内存使用,特效和API)