算法导论12.2-8 二叉搜索树的非递归遍历先驱节点分析
来源:互联网 发布:菲律宾网络诈骗 编辑:程序博客网 时间:2024/06/05 09:56
思路:
就是先调用minimum找到二叉树中的最小关键字的结点,即二叉树最左边的树叶,然后依然迭代地调用tree_successor寻找前一个结点x的后继:即比x->key大的所有关键字中最小的一个的节点。依次输出即可。
minimum很容易理解,利用蛮力一直往左遍历,到底即可。
tree_successor分两种情况,如果x有右子树,则x的后继就是右子树中最小关键字的那个结点,如果x没有右子树,则后继是x的最底层祖先。最底层祖先听着很拗口,用图示表示就是:13号结点的后继是15,15即为13的后继,13的祖先有15和30,而15为13的最底层祖先。
分析:
其复杂度取决于访问结点的总次数,注意在bst_successor 访问其后继结点时,可能需要回溯多个父结点,或者一起往左访问多个结点。
对于度数为1的结点(叶子结点),需要访问一次;
度数为2的结点,需要访问两次,比如仅有左孩子的中间结点,第一次访问是想遍历其左子树信息,第二次访问是访问自己;
度数为3的结点,需要访问三次,
访问结点的总次数等于结点的度数之和,由于树的每一条边贡献两个度数,则结点的度数之和等于树的边数*2,
又根据平面图的欧拉定理r=e-v+2 (对于树来讲r=1),于是n个结点的树的边数为n-1,所以访问结点的总次数为2(n-1),即O(n)。
于是命题得证。
参考:http://blog.csdn.net/wdq347/article/details/8818687
0 0
- 算法导论12.2-8 二叉搜索树的非递归遍历先驱节点分析
- 《算法导论》二叉树遍历的递归&非递归实现
- 算法导论12.2-7.P165另一种非递归的中序遍历二叉树的办法
- 算法导论—二叉树非递归遍历
- 二叉树的非递归遍历及算法分析
- 二叉搜索树的递归遍历和非递归遍历
- 算法导论第二版习题10.4-5.非递归有父节点中序遍历二叉树
- 算法导论 习题10.4-5 二叉树的遍历(非递归,O(1)存储)
- 二叉树遍历的非递归算法
- 遍历二叉树的非递归算法
- 遍历二叉树的非递归算法
- 二叉树的遍历非递归算法
- 遍历二叉树的非递归算法
- 二叉树的遍历非递归算法
- 二叉树遍历的非递归算法
- 二叉树的非递归遍历算法
- 二叉树遍历的非递归算法
- 二叉树遍历的非递归算法
- setLastFrameCallFunc接口不能使用解决方案
- scrollTo与scrollBy
- mysql新增授权给特定IP访问的用户
- C++学习:字符串分割函数
- JavaScript总结
- 算法导论12.2-8 二叉搜索树的非递归遍历先驱节点分析
- PHP SPL 数据结构笔记摘要
- Android中设置控件透明度的方法
- 加一行,减一行
- MySQL之配置参数优化
- 函数篇之——函数也是数据
- 错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算
- 嵌入式方向如何转行?
- 编写高效的C程序与C代码优化