我正在通过职业杯指南作为通过基本CS主体的速成课程,并坚持计算二叉树的最小/最大深度的示例。由于这是几乎所有例子,我认为我会在这里发表一个问题。了解如何计算二叉树的深度
该指令旨在实现一种方法,该方法将检查树是否平衡。为了做到这一点,你需要比较最小深度和最大深度,并确保它们之间的差值不大于1。这个原则就像它所得到的一样简单。第15行的方法是为了做到这一点。
但是,我不明白每个帮助程序方法(和minDepth
)的返回语句是怎么回事。如何从root.left
或root.right
派生出一个数字? 是否Math.max
功能简单地假设一个1
或0
是有值/空节点,或者,由于被指定值(只是Node
对象),确实Math.max(maxDepth(root.left), maxDepth(root.right)
本身等于0
,从而增加由1
直到返回值两个节点都是空的?
如果所以这是用于计算一个树的最小/最大深度的一般过程:
minDepth =没有根有孩子吗? 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 }
这就是我没有遵循的:maxDepth(root.left)如何返回树的深度? – NealR
@NealR'maxDepth(root.left)'返回子树的最大深度,其根是原始树的根的左子。如果您对递归不熟悉,则需要时间来习惯它(并且相信它实际上可行)。 – Eran
对不起,在这里头很重,但是这些数字(最大深度)是如何计算的? – NealR