社区
数据结构与算法
帖子详情
大家讨论一下后序遍历二叉树的非递归算法好吗?想了很久都想不出来,帮帮忙吧.....
csdn_lxb
2002-08-03 06:02:29
同标题
...全文
78
5
打赏
收藏
大家讨论一下后序遍历二叉树的非递归算法好吗?想了很久都想不出来,帮帮忙吧.....
同标题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hyeena
2002-08-25
打赏
举报
回复
看来我的50分的问题是白问了!
wangmin_yjitx
2002-08-04
打赏
举报
回复
要用到栈,每个结点要两次入栈,可设标志位,第二次出栈就可访问。
jet8
2002-08-03
打赏
举报
回复
后序遍历过程中,对于某节点x,从x的左孩子返回后,应将x出栈。但此时还不能访问x,所以x还需要再次入栈。当从x的右孩子返回时,x将再次出栈。这样,遍历过程就面对一个问题:当x出栈后,判断是从左孩子返回的还是从右孩子返回的?解决的方法是在x入栈的时候同时将一个标志入栈。x第一次入栈时,将标志0同时入栈;x第二次入栈时,将标志1同时入栈;x出栈时,若标志是0,则表示从左孩子返回;若标志为1,则表示从右孩子返回。下面的算法没有上机测试,供你参考。
typedef struct _btree{//二叉树的节点结构
char data; //数据域
struct _btree *lchild; //左孩子指针
struct _btree *rchild; //右孩子指针
}btree;
typedef struct _stk{//栈节点结构
int flag; //标志域
btree *bt; //二叉树节点指针
}stk;
void postorder(btree *rt)
{
btree *p;
int flag;
initstk();//将栈清空
p=rt;
while (p||!empty()){//empty()函数用于栈判空
if (p) {
push(p,0);//将当前指针和标志0入栈
p=p->lchild;
}
else{
pop(&p,&flag);//取得栈顶指针和标志
if (!flag) {
push(p,1);
p=p->rchild;
}
else {
visit(p);//访问p所指向的节点
p=NULL;
}
}
return;
}
lovetsinghua
2002-08-03
打赏
举报
回复
后序的递归:postorder(node *current){ //0
if(current != NULL){
postorder(current->left); //1
postorder(current->right); //2
..........
action(current);
..........
}
我想你要问的问题,应该是用栈吧?如果,不用栈的话,可以去线索化去实现,那样就很简单,线索化的主要原理是用原有的空指针来存放结点的前驱和后继指针。
如果用栈,嘿嘿,有点烦的地方是,如果是每访问一个新的结点都要压栈的话,那一次操作对于一个结点会压栈3次。(你可以看到上面的0,1,2)晕。。。那么action(current)在那一次的时候执行呢?其实,除了第一点(head),别的结点,可以做一个计数变量。
第一次退栈:i++;重新压栈;并把它的LEFT也压栈。
第二次退栈:i++;重新压栈;将其RIGHT压栈。
第三次退栈:i++;(i==3)将该结点标为将要访问的结点。
不然,你可以另做一个栈,用来代替i.
gonglei007
2002-08-03
打赏
举报
回复
Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType e))
{
InitStack(S);Push(S,T);
while(!StackEmpty(S))
{
Push(S,p->lchild);
}
Pop(S,p);
if(!StackEmpty(S))
{
Pop(S,p);
if(!Visit(p->data))return ERROR;
Push(S,p->rchild);
}
return OK;
}
二叉树
遍历的
非递归
算法
本文详细介绍了如何使用
非递归
方式遍历
二叉树
,包括前序遍历、中序遍历和
后序遍历
的
算法
实现。通过循环和栈的操作,实现了对
二叉树
节点的访问,同时提供了完整的代码示例。
后序遍历
由于其特殊的顺序,需要额外的标志变量来跟踪节点状态。
二叉树
的
后序遍历
非递归
算法
本文介绍了一种使用双栈实现
二叉树
后序遍历
的
非递归
算法
,通过模仿系统栈的工作原理,提高了遍历效率。该方法首先进行类似先序遍历的节点压栈,再逆序输出,得到正确的
后序遍历
结果。
二叉树
的遍历(先序、中序、后序、层次)
本文介绍了
二叉树
的先序、中序、后序和层次四种遍历
算法
,包括概念、递归与
非递归
代码及例题。还阐述了由不同遍历序列构造
二叉树
的方法,如先序与中序、后序与中序、层序与中序、先序与后序(需无度为1的结点),并给出相关例题解答。
二叉树
的中序遍历
非递归
算法
本文详细介绍了
非递归
方式实现
二叉树
的中序、先序和
后序遍历
算法
,通过栈来替代递归调用,实现了
二叉树
节点的有序访问。代码示例清晰地展示了每种遍历方式的具体实现步骤。
二叉树
遍历之
非递归
算法
本文介绍了
二叉树
的四种
非递归
遍历
算法
:先序、中序、后序及层序遍历,并提供了详细的
算法
思路及C++实现代码。
数据结构与算法
33,025
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章