社区
数据结构与算法
帖子详情
求救!如何用非递归方法实现二叉树的遍历
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
打赏
举报
回复
二叉树的遍历:前序、中序、后序?
ACM周记(四)
ACM周记
题解 | #
二叉树
根节点到叶子节点和为指定值的路径#
楼主拿了上海一家IC独角兽的offer,给的48w工资+25w股权激励,公司业务主要是CPU,GPU的研发,另外面了成都的华为(通信领域芯片研发),对接hr说机。武汉烽火通信,网络产出线逻辑部门,感觉给的薪资还能接受,但网上怎么一搜烽火全是劝退的,吓人,有没有懂的好兄弟来指点一下啊 #晒一晒我的offer# #23届找。江西南昌人,双非本,211硕,offer选择1.中车株洲所,在湖南株洲,时代电气国家变流中心,10*15,福利比较多,公积金一个月2400,政府人才补贴2.4w。124加班,偶尔出差。
我透了个dj,人麻了,马的,考公吧,不卷了,我草
题解 | #三角形判断# #include <stdio.h>int main(){ int a = 0; int b = 0; int c = 0; 题解 | #有效括号序列# /** * 代码中的类名、
方法
名、参数名已经指定,请勿修改,直接返回
方法
规定的值即可 * * * @param s string字符串 * @return bo题解 | #
二叉树
的中序
遍历
# 1. 整棵树左边界从根到叶子依
Jenkins的部署过程,从输入分支名开始,后台都经历了哪些
985本硕,三段开发/数据库实习(2大厂+1量化),一篇存储demo在投,学校导师有大模型相关的论文准备投(方向是大模型优化/大模型和推荐算法结合),我二作,这。有没有uu目前还没有找到满意的工作的,说实话,拿到了几个offer,但是真的,太不好了,前一段实习实在是被pua的受不了又跑路了,现在还在挣扎找工作,发现很多实。总结:核心是叶子节点层次
遍历
,按照从左到右的顺序,如果出现了第一个节点为null, 后面的节点有一个为空,就不是完全
二叉树
,如果都不为空,说明层次
遍历
完成,是完。mvvm,它怎么工作的?
C++笔试题目大全
1 c++ c++ c++ c++ 笔试题汇总 ① 链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是 这 样的: 1->2->3->4->5 通过反转后成为 5->4->3->2->1 。 最容易想到的
方法
遍历
一遍链表,利用一个辅助指针,存储
遍历
过程中当前指针指向的下一个 元 素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章