算法导论12.2-8 二叉搜索树的非递归遍历先驱节点分析
2015-12-28 16:17
295 查看
思路:
就是先调用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)。
于是命题得证。
参考:/article/8026734.html
就是先调用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)。
于是命题得证。
参考:/article/8026734.html
相关文章推荐
- 自己写的一个tomcat发布脚本
- TsinghuaX: 00740043X C++语言程序设计基础 第四章提纲
- 取会邮件客户端中的密码
- 搜索字符串strstr()函数
- mac上mysql root密码忘记或权限错误的解决办法
- iOS 学习(深拷贝 浅拷贝)
- Javascript:谈谈JS的全局变量跟局部变量
- Fresco通过后处理器(Postprocessor)生成仿skype字母和背景色的头像
- hdu1879 最小生成树模板 peim和kruskal
- scrollTo与scrollBy
- Volley缓存-原理介绍
- LeetCode 111:Minimum Depth of Binary Tree
- Android学习路线指南
- 设计原则之迪米特法则
- Android 高仿腾讯旗下app的 皮肤加载技术
- 12,13,wedfrom 基本控件
- R语言练习(一)
- 循环语句(for语句的用法)
- TsinghuaX: 00740043X C++语言程序设计基础 第三章提纲
- OA系统的左侧菜单栏的菜单项的处理