如果BST中的有序后继函数取Oh,为什么在n次调用Oh函数时迭代有序遍历取On?

问题描述

在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)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...