平衡二叉树深度

时间:2012-03-23 10:47:26

标签: binary-tree max min depth formulas

当给定多个节点时,我们可以通过log2(n)来计算二叉树的最小深度

其中n是节点数。

如果您将树绘制为最大深度(例如12个节点),则表明如果树要保持平衡,则最大深度只能为4。

                0
               /   \
              0     0
            /  \   / \
           0    0 0   0
          /\     \     \ 
        0   0      0    0

抱歉糟糕的ascii艺术。有没有人知道在给定节点数时能够计算二叉树最大深度的论坛?或者至少指出我正确的方向?

3 个答案:

答案 0 :(得分:2)

使用根元素:

int maxHeight(BinaryTree *p) {
  if (!p) return 0;
  int left_height = maxHeight(p->left);
  int right_height = maxHeight(p->right);
  return (left_height > right_height) ? left_height + 1 : right_height + 1;
}

通过使用节点数和一些数学逻辑(我绝对无法正确表达(我绝不是数学大师);但这里是):

观察:

  • 2-3个节点=> maxDepth = 1(2 = 2 ^ 1,3 = 2 ^ 1,......< 2 ^ 2)
  • 4-7个节点=&gt; maxDepth = 2(4 = 2 ^ 2,5 = 2 ^ 2,..,6 = 2 ^ 2,..,7 = 2 ^ 2,... <2 ^ 3)
  • 8-15个节点=&gt; maxDepth = 3
  • ...

分析:

  
      
  • m =&gt;最大深度(实际深度的INT部分,丢弃任何小数位)
  •   
  • n =&gt;节点数

  •   
  • ln =&gt;自然对数(= log [e])

  •   
  • 2 ^ m = n

  • ln(2 ^ m)= ln(n)

  • m * ln(2)= ln(n)
  • m = ln(n)/ ln(2)

结论:

现在,如果m = 2,...,那么最大深度为2.只需得到它的int部分。 ; - )


注意:我肯定在这里重新发明轮子;但这可能是处理你一无所知的事情的乐趣的一部分;并且这样做,完全遵循你的直觉和观察......: - )

答案 1 :(得分:2)

最简单的答案如下:

int getMaxDepth(Node node)
{
    if(node == null) {
        return 0;
    }

    int leftDepth = 1 + getMaxDepth(node.left);
    int rightDepth = 1 + getMaxDepth(node.right);

    return left > right ? left : right;
}

概念explained

答案 2 :(得分:1)

不给出给定(n)= 15的节点 公式为-log2n(log n base 2) 现在取最大值必须小于15,并且必须是2的幂函数。 在这里,15给出no将是8。 现在,n = 8 log2(8)= 3,这是我们要求的答案