| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1460 人关注过本帖
标题:二叉树非递归调用后序遍历
只看楼主 加入收藏
豆豆89128
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-10-24
收藏
 问题点数:0 回复次数:6 
二叉树非递归调用后序遍历
以下为二叉树非递归调用算法遍历,但是我不知道是何解。希望各位高手在每句的后面给注释一下,谢谢了!

void     PostOrder(BiTree T, Status ( *Visit ) (ElemType e))
{     //
InitStack(S);
while ( T!=NULL || !StackEmpty(S) ){
while ( T != NULL ){
Push(S,T,0);
T = T->lchild;
}
while ( !StackEmpty(S) && GetTopTag(S)==1){
Pop(S, T);
Visit(T->data);
}
if ( !StackEmpty(S) ){
SetTopTag(S, 1);         // 设置栈顶标记
T = GetTopPointer(S);     // 取栈顶保存的指针
T = T->rchild;
}else break;
}
}
搜索更多相关主题的帖子: 二叉树 遍历 递归 
2008-10-25 16:20
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
这个非递归比前序和中序难理解一些,这是因为,在遍历左右子树的时候,需要通过标记tag来标识当前是左子树还是右子树,呵呵...
2008-10-25 16:36
豆豆89128
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-10-24
收藏
得分:0 
谢谢!
请各位高手赐教
2008-10-25 16:40
豆豆89128
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-10-24
收藏
得分:0 
回复 2# geninsf009 的帖子
请你告诉我算法是怎么样的执行的啊?谢谢!
2008-10-25 18:00
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
好的,你稍等,正在给你加注释...
2008-10-25 18:22
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
void  PostOrder(BiTree T, Status ( *Visit ) (ElemType e))
{     
    InitStack(S);
    while ( T!=NULL || !StackEmpty(S))              //如果当前结点不空或者堆栈也不空,就继续遍历
   {
        while ( T != NULL ){                        
            Push(S,T,0);                            //把向左最左结点方向上所有的结点压入堆栈,标记是"左"
            T = T->lchild;                          //一直向左子树的方向走下去,直到最左边的结点
        }
        while ( !StackEmpty(S) && GetTopTag(S)==1)  //如果堆栈顶部的元素是要访问的右子结点
       {
            Pop(S, T);                              //退栈,从堆栈中获取结点
            Visit(T->data);                         //访问当前的结点
       }
       if ( !StackEmpty(S) )                        //如果栈不空但是栈顶的元素标记已经是0"左"了
       {
           SetTopTag(S, 1);                         // 把栈顶标记设为1"右"
           T = GetTopPointer(S);                    // 取栈顶保存的指针
           T = T->rchild;                           //向右子树遍历
        }
       else
            break;
    };
};
ps:给你改了一下,可能会有点偏差,多指教。
2008-10-25 18:39
豆豆89128
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-10-24
收藏
得分:0 
谢谢了啊!不过我已经做好了。
2008-10-28 16:16
快速回复:二叉树非递归调用后序遍历
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016922 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved