了解如何计算二叉树的深度(Understanding how to calculate the de

2019-10-20 12:33发布

我经历了职业生涯杯指南作为速成课程通过基本的CS校长和停留在其计算二叉树的最小/最大深度的例子。 由于这是我与几乎所有的例子有同样的问题,我想我会在这里发表的问题。

该指令实施,将检查,看是否有树是平衡的方法。 为了做到这一点,你需要用最大深度的最小深度比较,并确保它们的区别是不大于1,这主要是直接了当。 第15行的方法是为了做到这一点。

不过,我不明白是什么在每个helper方法(的return语句回事maxDepthminDepth )。 如何是一个数字被从任何来源的root.leftroot.right ? 是否Math.max功能简单地假设一个10是有值/空节点,或者,由于没有被指定的值(只是Node对象),确实Math.max(maxDepth(root.left), maxDepth(root.right)本身等于0 ,从而通过增加的返回值1 ,直到两个节点都为空?

如果所以这是用于计算一个树的最小/最大深度的一般过程:

minDepth =没有根有孩子吗? 是= minDepth = 1,无= 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  }

Answer 1:

maxDepth(root.left)返回左子树的最大深度。
maxDepth(root.right)返回右子树的最大深度。
这两者的最大值是最大子树的深度。
根节点添加1,你得到的树的最大深度。

假设这是树:

            A
         B      C
       D   E   F   G
     H
   I

只要看看它可以看到最大深度为5,分钟深度(由路径ABDHI形成)的3(通过多个路径形成,例如ACG)。

现在,最大深度为1(用于根A)+两个子树的最大深度。
第一子树中,根是B具有最大深度4(BDHI)。 所述第二子树,其根是C具有最大深度2(CF)。
最大值(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根。



Answer 2:

嗯,这是一个检查树的两侧,然后将结果与任何最大或最小比较递归函数。

图片帮助。

       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工作本质上是相同的方式。



文章来源: Understanding how to calculate the depth of a Binary Tree