树的遍历——后序
来源:互联网 发布:淘宝照片后期处理 编辑:程序博客网 时间:2024/05/23 01:15
感觉上在树的遍历类型中,属后根序遍历的非递归实现最不好写。
下面算法取自:http://topic.csdn.net/t/20021018/17/1107596.html
typedef struct {
BTNode* ptr;
enum {0,1,2} mark;
} PMType; //有mark域的结点指针类型
void PostOrder_Stack(BiTree T)//后续遍历二叉树的非递归算法,用栈
{
分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作.
下面算法取自:http://topic.csdn.net/t/20021018/17/1107596.html
typedef struct {
BTNode* ptr;
enum {0,1,2} mark;
} PMType; //有mark域的结点指针类型
void PostOrder_Stack(BiTree T)//后续遍历二叉树的非递归算法,用栈
{
PMType a;}//PostOrder_Stack
InitStack(S); //S的元素为PMType类型
Push (S,{T,0}); //根结点入栈
while(!StackEmpty(S))
{Pop(S,a);}
switch(a.mark)
{
case 0:Push(S,{a.ptr,1}); //修改mark域case 1:
if(a.ptr->lchild) Push(S,{a.ptr->lchild,0}); //访问左子树
break;Push(S,{a.ptr,2}); //修改mark域case 2:
if(a.ptr->rchild) Push(S,{a.ptr->rchild,0}); //访问右子树
break;visit(a.ptr); //访问结点,返回
}//while
分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作.
- 树的遍历—先序遍历、中序遍历、后序遍历
- 树的遍历——后序
- leedcode——二叉树的后序遍历
- lintcode——二叉树的后序遍历
- 树的后序遍历
- 树的后序遍历
- 数据结构与算法——二叉树的前序遍历,中序遍历,后序遍历
- 二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方法
- 树的前序遍历,中序遍历,后序遍历,层次(广度)遍历
- 二叉树的先序遍历,后序遍历,中序遍历,层次遍历
- 二叉树的遍历(1)--先序遍历,中序遍历,后序遍历
- 二叉树的遍历(前序遍历、中序遍历、后序遍历)
- 二叉树的遍历 前序遍历 中序遍历 后序遍历
- 二叉树的遍历代码(先序遍历,中序遍历,后序遍历)
- 二叉树的遍历:前序遍历、中序遍历和后序遍历
- 二叉树的遍历(3):后序遍历
- 二叉树的后序遍历和层次遍历
- 二叉树的后序遍历
- 重新回来
- 用 PHP 代码生成 Flash 文档
- eCGUI让DOS程序自带输入法,完全图形操作!
- SVN完全备份,增量备份,库同步
- check、lock、using语句归纳
- 树的遍历——后序
- 关于改变innodb_log_file_size后无法启动mysql的问题
- mysql增量、全量备份
- (int)float==(int&)float 详解。
- first page
- 理解同步与异步
- 如何在html或javascript调用DLL文件中的方法
- Ubuntu8.04, eclipse 安装subclipse
- VC调用 JavaScript 难题:如何使当前程序的对象进入脚本