我经历了职业生涯杯指南作为速成课程通过基本的CS校长和停留在其计算二叉树的最小/最大深度的例子。 由于这是我与几乎所有的例子有同样的问题,我想我会在这里发表的问题。
该指令实施,将检查,看是否有树是平衡的方法。 为了做到这一点,你需要用最大深度的最小深度比较,并确保它们的区别是不大于1,这主要是直接了当。 第15行的方法是为了做到这一点。
不过,我不明白是什么在每个helper方法(的return语句回事maxDepth
和minDepth
)。 如何是一个数字被从任何来源的root.left
或root.right
? 是否Math.max
功能简单地假设一个1
或0
是有值/空节点,或者,由于没有被指定的值(只是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 }
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根。
嗯,这是一个检查树的两侧,然后将结果与任何最大或最小比较递归函数。
图片帮助。
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
工作本质上是相同的方式。