【问题标题】:Balanced Binary Trees Depth平衡二叉树深度
【发布时间】:2013-07-14 03:21:43
【问题描述】:

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

其中 n 是节点数。

如果你画出树的最大深度,例如 12 个节点,你会发现如果树要保持平衡,最大深度只能是 4。

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

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

【问题讨论】:

    标签: binary-tree max min depth formulas


    【解决方案1】:

    通过使用根元素:

    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,..
    • 4-7 个节点 => 最大深度 = 2 (4 = 2^2, 5 = 2^2,.., 6 = 2^2,.., 7 = 2^2,...
    • 8-15 个节点 => 最大深度 = 3
    • ...

    分析:

    • m => max Depth(实际深度的INT部分,舍去小数位)
    • n => 节点数

    • ln => 自然对数 (=log[e])

    • 2^m = n

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

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

    结论:

    现在,如果 m = 2,... ,则最大深度为 2。只需获取其中的 int 部分即可。 ;-)


    注意:我肯定是在重新发明轮子;但这可能是处理你一无所知的事情的乐趣的一部分;并按照你的直觉和观察去做...... :-)

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

        设节点数给定(n)=15 公式是- log2n (log n base 2) 现在取一个最大值,该最大值必须小于 15,并且必须是 2 的幂结果。 因为这里给出了 15,所以没有将是 8。 现在,n=8 log2(8)= 3,这是我们需要的答案

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 2018-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多