- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
chap6.3 遍历二叉树
6.3遍历二叉树和线索二叉树 6.3.1 遍历二叉树 一、递归算法 在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树的问题,即如何按某条搜索路径巡访树中的每一个结点,使得每一个结点均被访问一次,而且仅被访问一次。 遍历对线性结构是容易解决的,而二叉树是非线性的,因而需要寻找一种规律,以便使二叉树上的结点能排列在一个线性队列上,从而便于遍历。 1、先序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)访问根结点; (2)先序遍历左子树; (3)先序遍历右子树。 用伪码表示: void PreOrder(T)//T是树根 { if(T为空)return; 访问T的元素; PreOrder(T的左子树); PreOrder(T的右子树); } 2、中序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)中序遍历左子树; (2)访问根结点; (3)中序遍历右子树。 用伪码表示: void InOrder(T)//T是树根 { if(T为空)return; InOrder(T的左子树); 访问T的元素; InOrder(T的右子树); } 3、后序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。 void PostOrder(T)//T是树根 { if(T为空)return; PostOrder(T的左子树); PostOrder(T的右子树); 访问T的元素; } 先序遍历的例子 PreOrder(T):先序遍历以T为根的树。 树的遍历的实现: 下面给出中序遍历二叉树的递归算法。 二、非递归算法 递归思想虽然可以很好地适应人的思维,利用它可以快速地设计出算法,但是它的执行效率却是相当的低,为了提高程序的执行效率,某些时候把递归的程序化为非递归的是很有必要的。 我们可以想象,递归程序通常都涉及到一个回溯的问题。比如在二叉树中,进行中序遍历时,刚开始是沿着左子树一直向下运行,直到左子树遍历完成,才去遍历根,然后是右子树。那么怎么样能够从下面的结点回到上面?在递归程序中该结点由每一层递归中的变量保存,如果写成非递归程序,也需要有保存上面结点的位置,通常用栈来保存。 我们看一下中序遍历的非递归过程。 根据这样的分析过程可以写出如下的非递归算法: 非递归算法: ①定义一个栈S ②根结点T入栈s.push(T) ③while(S非空) { 如果s的栈顶元素为空,break(跳出循环) 否则,栈顶的左孩子入栈 } ④跳出循环是因为栈顶元素为空,所以栈顶元素出栈 ⑤此时如果栈空,算法结束 否则,栈顶元素出栈,访问之,且其右孩子入栈,转到③执行 同理,先序遍历的过程如下 (每次的非空栈顶元素依次访问) 二叉树的先序遍历的非递归算法 ①定义一个栈S ②根结点T入栈s.push(T) while(S非空) { ③while(S栈顶元素非空) { 如果s的栈顶元素为空,break(跳出循环) 否则,访问栈顶元素,栈顶的左孩子入栈 } ④跳出循环是因为栈顶元素为空,所以栈顶元素出栈 ⑤此时如果栈空,算法结束 否则,栈顶元素出栈,且其右孩子入栈 } 后序遍历比较复杂。 中序遍历是在元素出栈后,右子树入栈前进行访问;先序遍历是在左子树入栈前进行访问。 后序遍历应该在右子树出栈后进行访问,所以我们应该设立一个标志,在右子树入栈前该标志入栈;右子树访问完毕后出栈,标志也出栈,标志下面的那一个结点是根,应该被访问了。 后序遍历非递归算法: ①定义一个栈S ②根结点T入栈s.push(T) ③while(1) { 如果s的栈顶元素为空,break(跳出循环) 否则,栈顶的左孩子入栈 } ④跳出循环是因为栈顶元素为空,所以栈顶元素出栈 while(1) { ⑤此时如果栈空,算法结束 如果栈顶元素是标志,则标志出栈,再弹出一个且访问之。 如果栈顶元素temp不是标志,则标志入栈,temp的右孩子入栈,且结束循环 } 转到③执行 重写一下就是: ①定义一个栈S ②根结点T入栈s.push(T) while(1) { ③while(1) { 如果s的栈顶元素为空,break(跳出循环) 否则,栈顶的左孩子入栈 } ④跳出循环是因为栈顶元素为空,所以栈顶元素出栈 while(1) {⑤此时如果栈空,算法结束 如果栈顶元素是标志,则标志出栈,再弹出一个且访问之。 如果栈顶元素temp不是标志,则标志入栈,temp的右孩子入栈,且结束循环 } } #include stack using namespace std; void PostOrder(node *t) { stacknode*
您可能关注的文档
最近下载
- PLC应用技术(西门子S7-1200)全套教学课件.pptx VIP
- 宿州市市直机关遴选公务员考试真题2024.docx VIP
- GBT 35694-2017 光伏发电站安全规程.pdf
- DB41T 2312-2022 波形钢腹板预应力混凝土组合箱梁桥施工规范.pdf VIP
- 征信简版电子版PDF个人信用报告最新版2024年可编辑带水印模板.pdf VIP
- 胃肠道肿瘤的基因检测与个体化治疗.pptx VIP
- 部编版语文四年级上册第二单元综合素质测评B卷(含答案).pdf VIP
- 《道路深层病害探地雷达无损检测技术规范》DB41 T2525-2023.doc VIP
- 中国儿童幽门螺杆菌感染诊治专家共识(2022) .pdf
- 2021届广东省华师附属高级中学(广州总校)三下学期5月综合测试(三模)文科综合地理试卷无答案.pdf VIP
文档评论(0)