二叉树遍历的非递归算法
来源:互联网 发布:山东大学威海知乎 编辑:程序博客网 时间:2024/05/24 04:32
三种次序的寻访路线,它是从根结点开始沿左子树深入直到最左下端时,返回进入刚刚遇到结点的右子树;在右子树中,也是先深入到它的最左下结点时返回刚遇到结点的右子树······如此深入和返回,直到从根结点的右子树返回根结点止。在这一过程中,返回结点的顺序恰与深入结点的顺序相反,先深入的后返回,正好符合栈的特点。所以可以用栈来保存遍历过程中的结点信息来实现遍历二叉树的非递归算法,并且假定栈空间足够大不会发生栈上溢以简化算法。
1.前序遍历二叉树的非递归算法:
思想:从二叉树的根结点开始,沿左子树一直深入到最左下结点时为止,在深入的过程中访问所遇到的结点,并把所遇到结点的非空右孩子进栈,当左子树结点全部处理完之后,从栈顶退出当前最近访问过结点的右孩子,再按上述过程遍历该结点的右子树;如此重复,直到栈空为止。
在下面的算法中,二叉树以二叉链表存储,用一维数组stack[MAXSIZE]作为栈来保存结点的右孩子信息,top为栈顶指针,p始终指向寻访过程中当前要处理的结点。
2.中序遍历二叉树的非递归算法思想:基本与前序遍历相同,只是沿左子树向下搜索的过程中先将所遇结点进栈,待遍历完左子树返回时从栈顶退出结点并访问,然后再遍历右子树。
3.后序遍历二叉树的非递归算法
后序遍历二叉树的非递归算法要比前序和中序稍微复杂些。后序遍历中,当搜索指针指向一个结点时,不能马上访问,需要遍历先遍历左子树,所以结点需要进栈保存;当遍历完左子树返回再次搜索该结点时还不能进行访问,还需要遍历其右子树,所以结点需要再次进栈保存;即一个结点在两次进栈两次出栈之后才能访问。为了区别某一结点指针的两次出栈,需设置一标志flag同结点同时进出栈,flag定义如下:
flag={ 0, (结点第一次进出栈,不访问);
{ 1, (结点第二次进出栈,出栈后访问);
栈中数据类型可定义为指向结点的指针和flag组成的结构体类型:
typedef struct stackelem
{
bitree link;
int flag;
}stackelemtype;
其后序遍历二叉树的非递归算法描述如下:
- 二叉树遍历的非递归算法
- 遍历二叉树的非递归算法
- 遍历二叉树的非递归算法
- 二叉树的遍历非递归算法
- 遍历二叉树的非递归算法
- 二叉树的遍历非递归算法
- 二叉树遍历的非递归算法
- 二叉树的非递归遍历算法
- 二叉树遍历的非递归算法
- 二叉树遍历的非递归算法
- 二叉树遍历的非递归算法
- 二叉树遍历的非递归算法
- 二叉树的非递归遍历算法
- 二叉树遍历的非递归算法
- 遍历二叉树的递归算法与非递归算法
- 二叉树的递归和非递归的遍历算法
- 遍历二叉树的递归和非递归算法
- 二叉树遍历的递归与非递归算法
- spring的自动化装配bean
- 基于tiny4412开发板LED灯驱动标准的read write函数写法
- 从零开始学习c++之程序计算的简单应用
- zookeeper在windons下安装
- VINS mono 系统学习 二
- 二叉树遍历的非递归算法
- .WebDelegatingSubject cannot be cast to cn.itcast.bos.domain.system.User
- 开启博客生涯的第一天
- java面向对象的概念总结
- 網絡Io实现方式
- 阿里云技术教程系列-ECS使用须知
- 插入排序—直接插入排序
- Ubuntu系统中安装Java环境
- webpack+react+node采坑之旅 (上)