考虑以下n=7 的平衡二叉树(这实际上是一棵完全二叉搜索树,但我们暂且不讨论,因为一棵完全二叉搜索树也是一棵平衡二叉搜索树)。
5 depth 1 (root)
/----+----\
2 6 depth 2
/--+--\ /--+--\
1 3 4 7 depth 3
对于在这棵树中搜索任何数字,最坏的情况是我们达到树的最大深度(例如,在这种情况下为 3),直到我们终止搜索。在深度 3,我们执行了 3 次比较,因此,在任意深度 l,我们将执行 l 比较。
现在,对于上述任意大小的完整二叉搜索树,我们可以保存1 + 2^(maxDepth-1) 不同的数字。现在,假设我们有一个完整的二叉搜索树,其中正好有n(不同的)数字。那么以下成立
n = 1 + 2^(maxDepth-1) (+)
因此
(+) <=> 2^(maxDepth-1) = n - 1
<=> log2(2^(maxDepth - 1)) = log2(n - 1)
<=> maxDepth - 1 = log2(n - 1)
=> maxDepth = log2(n - 1) + 1
回想一下,maxDepth 告诉我们最坏情况的比较次数,以便我们在完整的二叉树中找到一个数字(或者它不存在)。因此
worst case scenario, n nodes : log2(n-1) + 1
为了研究这种搜索的渐近或限制行为,n 可以被认为是足够大,因此log2(n) ~= log2(n-1) 成立,随后,我们可以说该算法的一个相当好的(严格)上限是O(log2(n))。因此
在完全二叉树中搜索的时间复杂度,
对于n 节点,是O(log2(n))
对于不完全二叉搜索树,与上述类似的推理导致相同的时间复杂度。请注意,对于非平衡搜索树,n 节点的最坏情况是 n 比较。
答案: 从上面可以看出,O(n/2) 不是大小为n 的二叉搜索树的时间复杂度的适当界限;然而O(log2(n)) 是。 (请注意,对于足够大的n,先验可能是正确,但不是很好/严格的!)