问题描述
在BST中,获取给定节点的有序后继者需要O(h)时间复杂度,因此给定getNext()可以获取当前节点的有序继任者,您需要n次调用getNext()遍历树,使时间复杂度为O(nh)。
但是,书中给出了BST的迭代有序遍历,需要O(n)时间。我很困惑为什么会有区别。
(节点具有父指针)。
解决方法
得到有序后继者是O(h),而不是Ө(h)。仅有一半的链接将有一半的节点具有后继节点。让我们考虑遍历给定节点所需的指针解除引用的次数:
- 要遍历左侧子树的指针取消引用的数量,加上
- 要从左子树的最右边节点升起的数字=左子树的高度(最多),再加上
- 一个代表节点本身,再加上
- 下降到右子树最右边节点的数字=右子树的高度(最多),加上
- 右侧子树的编号。
所以上限是:
f(0)= 1
f(h)= f(h-1)+(h-1)+ h +(h-1)+ f(h-1)
= 2f(h-1)+ 3h-2
f(h)= 5·2 h -3h-4
且h为⌈log2n⌉,f为O(n)。