算法导论 练习10.4-5
2021/11/18 11:10:22
本文主要是介绍算法导论 练习10.4-5,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
给定一个n结点的二叉树,写出一个O(n)时间的非递归过程,将该树每个结点的关键字输出。要求除该树本身的存储空间外只能使用固定量的额外存储空间,且在过程中不得修改该树,即使是暂时的修改也不允许。
先结合上图说下具体的策略
对二叉树进行遍历(图中红色箭头所指方向),在遍历过程中存储两个点,分别是当前遍历的点记为now,以及上一步遍历的点记为last,将now和last均初始化为T.root,同时初始化root_num = 0,该变量表示遍历结点到达根结点的次数。根据now和last的关系,通过以下几种方式进行遍历:
0、检测now是否是根结点T.root,如果是,更新root_num到root_num + 1,root_num到达2时,遍历结束(该步每次更新后均进行)
1、检测last是否是now的left-child,如果是,说明last及其分支下所有结点完成遍历,进入2;若不是,再检测last是否是now的right-child,如果是,说明now及其分支下所有结点完成遍历,进入3;均不是的话,说明仍处于向下遍历过程,进入4
2、(last == now.left-child)检测now是否存在right-child,如果存在,更新last为now,now为now.right-child,同时打印更新后的now关键字(打印策略是只有last为now的父节点时才打印,最后需补打根结点);如果不存在,更新last为now,now为now.parent
3、(last == now.right-child)更新last为now,now为now.parent
4、(last == now or last == now.parent)检测now是否存在left-child,如果存在,更新last为now,now为now.left-child,同时打印更新后的now关键字;如果不存在,再检测now是否存在right-child,如果存在,更新last为now,now为now.right-child,同时打印更新后的now关键字;now即不存在left-child,也不存在right-child,说明此时now为叶结点,last和now交换位置
PRINT(T) root_num = 0 # 标志位,表示遍历到达根结点的次数,达到2时遍历结束 last = now = T.root # last、now初始化为根结点,分别表示上次和本次遍历的点 while root_num != 2 if last == now.left-child if now.right-child != NIL last = now now = now.right-child print now.key else last = now now = now.parent if now == T.root root_num += 1 else if last == now.right-child last = now now = now.parent if now == T.root root_num += 1 else if now.left-child != NIL last = now now = now.left-child print now.key else if now.right-child != NIL last = now now = now.right-child print now.key else last, now = now, last if now == T.root root_num += 1
这篇关于算法导论 练习10.4-5的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07转型传统行业避坑指南!
- 2025-01-07百万架构师第九课:源码分析:Spring 源码分析:Spring5源码分析-预习资料|JavaGuide
- 2025-01-07为你的程序精选的4个优质支付API
- 2025-01-06责任分配矩阵在项目管理中的作用:结合工具提升团队生产力
- 2025-01-06板栗看板:优化项目管理的实用策略,助你轻松完成任务
- 2025-01-06电商小白怎么选取合适的工具?一站式工具指南来啦
- 2025-01-06企业如何避免春节期间的项目断层?四大方法教给你!
- 2025-01-06初创团队如何在动态环境下利用看板工具快速迭代
- 2025-01-06企业内部管理如何实现高效?四大策略教会你
- 2025-01-06给 Postgres 写一个向量插件 - 向量类型