算法导论12.2-8 二叉搜索树的非递归遍历先驱节点分析

思路
就是先调用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

猜你喜欢

转载自blog.csdn.net/mistakk/article/details/50419751