O(logn)

时间:2015-11-15 00:50:51

标签: algorithm time-complexity avl-tree

我试图找出一种方法来计算树的高度,使用每个节点知道其平衡的事实。这种复杂性必须在O(logn)

这是我到目前为止所做的事情。

if(!node)
  return 0
if(node.balance > 0)
  return height(node.right) + 1
if(node.balance < 0)
  return height(node.left) + 1
return max( height(T.left), height(T.right)) + 1

我的想法是,如果树重正,穿过右侧而忽略左侧。如果树很重,请忽略右边并继续遍历那里。但是,如果树是平衡的,我有点担心该怎么做。那时,我们不会被迫运行max( height(T.left), height(T.right)) + 1,这意味着将访问子树中的每个节点,从而使这种复杂性为O(n)吗?

1 个答案:

答案 0 :(得分:1)

高度/深度与树的大小相关联,这是树平衡的直接结果。因为AVL是平衡的,所以如果你知道它的大小,你可以使用它的结构来计算O(1)中树的深度:

   lg N = log(N) / log(2) -- define a helper function for 2-log
   depth N = 1 + floor(lg(N)) -- calculate depth for size N > 0.

填充树时的图片:每个新的&#39;级别&#39;深度对应于达到的树的大小的阈值,即下一个2的幂。

你可以看出这是为什么:树的最深行是最大的&#39;当树N的大小只是2的幂的一个时。 1+对应于当前正在填充的最深行,直到树的深度变为下一个级别,floor(lg(N))对应于树所具有的深度。之前的水平&#39;。