了解如何计算二叉树的深度

时间:2014-07-22 22:28:17

标签: java c++ binary-tree binary-search-tree

我将通过职业杯指南作为基础CS校长的速成课程,并坚持计算二叉树最小/最大深度的示例。因为这是我几乎每个例子都有的问题,我想我会在这里发一个问题。

说明是实现一种方法,该方法将检查树是否平衡。为此,您需要将最小深度与最大深度进行比较,并确保它们之间的差异不大于1.这个原理与它一样简单。第15行的方法就是为了做到这一点。

但是,我不明白每个帮助方法(maxDepthminDepth)的return语句中发生了什么。如何从root.leftroot.right派生数字? Math.max函数是假设1还是0是否有值/ null节点,或者,因为没有指定值(只有Node对象) ,Math.max(maxDepth(root.left), maxDepth(root.right)本身是否等于0,从而将返回值递增1,直到两个节点都为空?

如果是这样,则用于计算树的最小/最大深度的一般过程:

minDepth = root有没有孩子? yes = minDepth = 1,no = minDepth = 0(如果有根)

maxDepth =循环通过两个分支,直到找到离根最远的叶子。保持柜台确定叶子。

1   public static int maxDepth(TreeNode root) {
2       if (root == null) {
3       return 0;
4       }
5       return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
6   }
7
8   public static int minDepth(TreeNode root) {
9       if (root == null) {
10          return 0;
11      }
12      return 1 + Math.min(minDepth(root.left), minDepth(root.right));
13  }
14
15  public static boolean isBalanced(TreeNode root){
16      return (maxDepth(root) - minDepth(root) <= 1);
17  }

2 个答案:

答案 0 :(得分:4)

maxDepth(root.left)返回左子树的最大深度 maxDepth(root.right)返回右子树的最大深度 这两个中的最大值是最大子树深度 为根节点添加1,即可获得树的最大深度。

假设这是树:

            A
         B      C
       D   E   F   G
     H
   I

通过观察,您可以看到最大深度为5(由路径A-B-D-H-I形成),最小深度为3(由多条路径形成,例如A-C-G)。

现在,最大深度为1(对于根A)+两个子树的最大深度 第一个子树,其根是B,具有最大深度4(B-D-H-1)。第二个子树,其根是C,最大深度为2(C-F) max(4,2)= 4
因此,整棵树的最大深度为1 + max(4,2)= 5。

如果我们使用示例树中的字母来表示以这些节点为根的子树,我们得到:

maxDepth(A) = 1 + max(maxDepth(B) , maxDepth(C)) =
              1 + max(1 + max(maxDepth(D) , maxDepth(E)), 1 + max(maxDepth(F) , maxDepth(G)) =
              1 + max(1 + max(1+max(maxDepth(H),0) , 1+max(0,0)), 1 + max(1+max(0,0) , 1+max(0,0)) =
              1 + max(1 + max(1+max(1+max(maxDepth(I),0),0) , 1), 1 + 1) =
              1 + max(1 + max(1+max(1+max(1+max(0,0),0),0) , 1), 1 + 1) =
              1 + max(1 + max(1+max(1+max(1,0),0) , 1), 2) =
              1 + max(1 + max(1+max(2,0) , 1), 2) =
              1 + max(1 + max(3 , 1), 2) =
              1 + max(4, 2) =
              1 + 4 =
              5

类似地,为了计算最小深度,计算两个(左和右)子树的最小深度,取两个中的最小值,并为根添加1。

答案 1 :(得分:2)

嗯,它是一个递归函数,它检查树的两边,然后将结果与max或min进行比较。

图片帮助。

       o  go left and right
     /    \
(+1)o      o(+1)       
    \       
     o(+1)   

所以我们把它带回代码。

return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));

调用堆栈看起来像这样

// max return 2
- left +1                      
    // max return 1
    -left 0                    
    -right +1
       // max return 0
      -left  0                 
      -right 0
- right +1
    //max return 0
    -left 0
    -right 0

Min的工作方式基本相同。