- 12
- 0
- 约6.19千字
- 约 13页
- 2021-05-31 发布于山东
- 举报
精品文档
精品文档
PAGE
PAGE13
精品文档
PAGE
用递归、非递归两种方法遍历二叉树
一、设计思想
二叉树的遍历分为三种方式,分别是先序遍历,中序遍历和后序遍历。先序遍历实现的次序是:根左右,中序遍历实现的是:左根右,后续遍历实现的是:左右根。
根据不同的算法分,又分为递归遍历和非递归遍历。
递归算法:
1.先序遍历:
先序遍历就是首先判断根结点是否为空, 为空则停止遍历, 不为空则将左子作为新的根
结点从头进行上述判断, 左子遍历结束后,再将右子作为根结点判断, 直至结束。抵达每一
个结点时,打印该结点数据,即得先序遍历结果。
2.中序遍历:
中序遍历是首先判断该结点是否为空,为空则结束,不为空则将左子作为根结点再进行判断,打印左子,然后打印二叉树的根结点,最后再将右子作为参数进行判断,打印右子,
直至结束。
3.后序遍历:
指针抵达一个结点时,判断该结点是否为空,为空则停止遍历,不为空则将左子作为新的结点参数进行判断,打印左子。左子判断达成后,将右子作为结点参数传入判断,打印右
子。左右子判断达成后打印根结点。
非递归算法:
1.先序遍历:
首先成立一个栈,当指针抵达根结点时,打印根结点,判断根结点是否有左子和右子。
有左子和右子的话就打印左子同时将右子入栈,将左子作为新的根结点进行判断,方法同上。若目前结点没有左子,则直接将右子打印,同时将右子作为新的根结点判断。若目前结点没有右子,则打印左子,同时将左子作为新的根结点判断。若目前结点既没有左子也没有右子,则目前结点为叶子结点,此时将从栈中出栈一个元素,作为目前的根结点,打印结点元素,
同时将目前结点同样按上述方法判断,依次进行。直至目前结点的左右子都为空,且栈为空时,遍历结束。
2.中序遍历:
首先成立一个栈,首先将指针指向根结点,将根结点入栈,然后将指针指向左子, 左子
作为新的结点,将新结点入栈, 然后再将指针指向目前结点的左子,直至左子为空,则指针
返回,出栈一个元素,作为目前结点,打印该结点,然后将指针指向目前结点右子,将右子
作为新的结点,结点入栈,再次进行上面的判断, 直至目前结点右子也为空,则再出栈一个
元素作为目前结点,一直到结束,使得目前结点右子为空,且栈空,遍历结束。
3.后续遍历:
首先从根节点开始遍历, 看根节点是否为空, 如果根节点不为空, 将根节点的元素压入
栈中,持续遍历,如果根节点有左子,索引移动到左子,并以左子为根节点持续遍历。如果左子不为空,则索引移动到左子并入栈;如果左子为空,索引移动到栈顶元素所在的节点,
如果此节点的右子不为空并且右子没有被接见过, 则索引移动到右子, 否则接见栈顶元素并
输出,并且定义此节点为被接见过得节点, 栈顶元素出栈,树节点定义为 NULL,持续遍历。
二、算法流程图
递归算法:
-1-
用递归、非递归两种方法遍历二叉树
创建二叉树
调用自己
调用对应函数
输出结果
图1递归算法流程图
先序非递归遍历:
得到根节点
输出目前节点
判断目前节点
是否存在左子
不存在
目前节点
是否存在右子
不存在
出栈,目前节
不为空 栈是否为空
点为出栈元
素
图2先序遍历的非递归算法流程图
存在目前节点的元素入栈,目前节点移动到左子上
存在
目前节点跳
到右子上
为空 结束
-2-
用递归、非递归两种方法遍历二叉树
中序非递归遍历:
得到根节点
判断目前节点
是否存在左子
不存在
输出目前节点
判断目前节点
是否存在右子
不存在
出栈,目前节
不为空
点为出栈元 栈是否为空
素
存在 目前节点的元素
入栈,目前节点
移动到左子上
目前节点跳
存在
到右子上
为空
结束
图3中序遍历的非递归算法流程图
-3-
用递归、非递归两种方法遍历二叉树
后序非递归遍历:
得到根节点
判断目前节点
是否存在左子
不存在
判断目前节点
是否存在右子
不存在
输出目前节点
出栈,目前节
不为空
点为出栈元 栈是否为空
素
目前节点的元素
存在
入栈,目前节点
移动到左子上
存在 目前节点跳
到右子上
为空
结束
图4后序遍历的非递归算法流程图
-4-
用递归、非递归两种方法遍历二叉树
三、源代码
前序非递归
#includestdio.h
structelement //用构造体建立二叉树元素
{
structelement*lchild;
intdata;
structelement*rchild;
};
intmain()
{
inti=1;
structelement*stack[30];
structelementa,b,c,d,e; //建立二叉树
a.data=1;b.data=2;c.data=3;d.data=4;e.data=5;
a.lchild=b;a.rchild=c;
b.lchild=
您可能关注的文档
- 用英文介绍一本书给朋友.docx
- 用英语自我介绍12篇.docx
- 用药错误应急方案及处理程序.docx
- 用营销策略招聘销售英.docx
- 用虚拟相关法测量两个同频信号相位差..docx
- 用虽然...但...造句成语造句.docx
- 用虽然但是造句汇总.docx
- 用血制度及流程..docx
- 用补偿法改装电表“大学物理实验.docx
- 用计算器找规律练习题..docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库附参考答案详解(培优).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库带答案详解(达标题).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库带答案详解(轻巧夺冠).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库带答案详解(预热题).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库附参考答案详解(b卷).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库带答案详解(综合题).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库带答案详解(精练).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库带答案详解(综合卷).docx
- 2026黑龙江鹤岗市工农区招聘公益性岗位人员34人备考题库精编答案详解.docx
- 2026《南京市某地块房地产开发项目策划设计》38000字.docx
最近下载
- 25个作业女性化教程.docx VIP
- 2025年九江职业大学单招职业适应性考试题库审定版.docx VIP
- 2025年九江职业大学单招职业适应性考试题库带答案详解(精练).docx VIP
- 2025年九江职业大学单招职业技能考试题库带答案.docx VIP
- 沙金矿合作合同10篇.docx VIP
- 2025年甘肃省公务员考试《申论》试题及答案解析(县乡卷.docx VIP
- PS-640U系列保护测控装置使用说明书_V4.00.pdf VIP
- 专题复习初中常见离子的检验.ppt
- 2025年人教版小学四年级(下)奥林匹克数学竞赛测试考试卷(附答案解析).docx
- 2025年专利代理师资格考试真题及答案.docx VIP
原创力文档

文档评论(0)