求救!如何用非递归方法实现二叉树的遍历

yadianna1 2002-11-26 05:29:52
求救!如何用非递归方法实现二叉树的遍历
...全文
163 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoukun666 2002-12-28
  • 打赏
  • 举报
回复

typedef struct {
BTNode* ptr;
enum {0,1,2} mark;
} PMType; //有mark域的结点指针类型
void PostOrder_Stack(BiTree T)//后续遍历二叉树的非递归算法,用栈
{
PMType a;
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域
if(a.ptr->lchild) Push(S,{a.ptr->lchild,0}); //访问左子树
break;
case 1:
Push(S,{a.ptr,2}); //修改mark域
if(a.ptr->rchild) Push(S,{a.ptr->rchild,0}); //访问右子树
break;
case 2:
visit(a.ptr); //访问结点,返回
}
}//while
}//PostOrder_Stack
分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作.


ttoth 2002-12-23
  • 打赏
  • 举报
回复
我得qq是54570383,希望你和我联系
ttoth 2002-12-23
  • 打赏
  • 举报
回复
这个问题挺简单的,我帮你作,做好给分啊
earnest810 2002-12-23
  • 打赏
  • 举报
回复
gz
cutejames 2002-12-02
  • 打赏
  • 举报
回复
用栈记录接点信息
wengzuliang 2002-12-01
  • 打赏
  • 举报
回复
用数组来表示一棵树
i -> 2*i , 2*i+1;
父亲 左儿子 右儿子
76ersjy2 2002-11-30
  • 打赏
  • 举报
回复
高程的教材上有答案。
plusir 2002-11-29
  • 打赏
  • 举报
回复
二叉树遍历还有一种方法是层次遍历.
算法如下:
1.把根节点插入队列
2.当队列中还有节点时:
取出队列中的下一个节点,打印节点的值;
如果节点中指向左子节点的指针非空,把左子节点插入队列;
如果节点中指向右子节点的指针非空,把右子节点插入队列;

template<typename NODETYPE>
void Tree<NODETYPE>::print( void ) const
{
typedef TreeNode<NODETYPE>* tempName ;
Queue<tempName> queue ;

TreeNode<NODETYPE>* tempPtr = NULL ;

queue.enqueue( rootPtr ) ;

while ( !queue.isQueueEmpty() ) {
queue.dequeue( tempPtr ) ;
cout << tempPtr->data << ' ' ;

if ( tempPtr->leftPtr )
queue.enqueue( tempPtr->leftPtr ) ;

if ( tempPtr->rightPtr )
queue.enqueue( tempPtr->rightPtr ) ;
}
}



flasty 2002-11-28
  • 打赏
  • 举报
回复
一般的程序语言都支持函数的递归调用,或者你可以自己写你的非递归程序,原理都是用堆栈,区别就是一个由系统来管理堆栈,另一个由自己来管理堆栈,都可以实现递归的功能。
袁尤军 2002-11-28
  • 打赏
  • 举报
回复
估计任何一本《数据结构》书中都有源程序
Devlinzy 2002-11-27
  • 打赏
  • 举报
回复
当然要用堆栈的原理,其实递归的方法也是用的堆栈啊。
只不过递归是系统用堆栈,现在是自己用而已。
还可以用线索二叉树。
lbylby 2002-11-27
  • 打赏
  • 举报
回复
前序和中序差不多的,就是后序有点麻烦!
CoolQ 2002-11-27
  • 打赏
  • 举报
回复
同意Devlinzy(赤枫)的看法!!
yadianna1 2002-11-26
  • 打赏
  • 举报
回复
楼上的兄弟能说具体一点吗?前序,中序,后序
neoshm 2002-11-26
  • 打赏
  • 举报
回复
原理是使用堆栈
Riemann 2002-11-26
  • 打赏
  • 举报
回复
这是别人给出的一个解答,非常好。
void PreOrder_Nonrecursive(Bitree T)//先序遍历二叉树的非递归算法
{
InitStack(S);
Push(S,T); //根指针进栈
while(!StackEmpty(S))
{
while(Gettop(S,p)&&p)
{
visit(p->data);
push(S,p->lchild);
} //向左走到尽头
pop(S,p);
if(!StackEmpty(S))
{
pop(S,p);
push(S,p->rchild); //向右一步
}
}//while
}//PreOrder_Nonrecursive

typedef struct {
BTNode* ptr;
enum {0,1,2} mark;
} PMType; //有mark域的结点指针类型
void PostOrder_Stack(BiTree T)//后续遍历二叉树的非递归算法,用栈
{
PMType a;
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域
if(a.ptr->lchild) Push(S,{a.ptr->lchild,0}); //访问左子树
break;
case 1:
Push(S,{a.ptr,2}); //修改mark域
if(a.ptr->rchild) Push(S,{a.ptr->rchild,0}); //访问右子树
break;
case 2:
visit(a.ptr); //访问结点,返回
}
}//while
}//PostOrder_Stack
分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作.

zfive 2002-11-26
  • 打赏
  • 举报
回复
二叉树的遍历:前序、中序、后序?

33,027

社区成员

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

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