我将通过职业杯指南作为基础CS校长的速成课程,并坚持计算二叉树最小/最大深度的示例。因为这是我几乎每个例子都有的问题,我想我会在这里发一个问题。
说明是实现一种方法,该方法将检查树是否平衡。为此,您需要将最小深度与最大深度进行比较,并确保它们之间的差异不大于1.这个原理与它一样简单。第15行的方法就是为了做到这一点。
但是,我不明白每个帮助方法(maxDepth
和minDepth
)的return语句中发生了什么。如何从root.left
或root.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 }
答案 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
的工作方式基本相同。