大家讨论一下后序遍历二叉树的非递归算法好吗?想了很久都想不出来,帮帮忙吧.....

csdn_lxb 2002-08-03 06:02:29
同标题
...全文
35 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;
}

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧