LeetCode中的Maximum Depth of Binary Tree和Minimum Depth of Binary Tree的比较
首先
树的题目一般可以使用递归来解决问题,而且递归的问题实在不能太关注于细节,应该这样将树看成是一个由根节点,左子树和右子树组成的一样东西。
Maximum
第一题的思路应该是这样的,要算出来所有一个二叉树的深度。什么是深度?其实直观地看一个树就是看这棵树有多少层,这棵树的深度就是多少。
那么如何算出来一个树的深度呢?利用上面对一棵二叉树的定义,可以这样理解,左子树和右子树的深度中,选择大的那一个,然后加上1,也就是根的层树就行了。
但是,别忘了,这个思考的前提是树不为null,当树为null的时候,没有根,也没有左子树,也没有右子树,就当然不能这样算了。所以再划分出来一种情况就是当root为null的时候,返回的是0。
贴代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int l = maxDepth(root.left);
int r = maxDepth(root.right);
return Math.max(l,r)+1;
}
}
Minimum
同理,第二道题目,最普遍的一种情况是左右子树都存在的情况,这时候最小值是左,右子树中取小的那一个深度,然后加上根就行了。
但是,这个考虑的时候,要考虑到除了根为空的时候,这一种特殊情况之外。还要考虑的是,当左子树为空的时候,上面那种最普遍的算法是不成立的,还按照上面那个来的话,会直接按空的子树来算出来最短的深度,注意对比一下最大深度,这中特殊情况下,普通的算法也是可以算的。那么就要分别考虑左右子树分别为空的情况了。
那么,左右子树都为空的情况呢?需不需要另外考虑。其实是不需要的,因为如果左子树为空后,右子树也是为空,那么返回的还是0,其实还是一个正确的答案。但是如果,单列出来,其实也是没有是问题的。
下面贴出代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int minDepth(TreeNode root) {
if(root == null){
return 0;
}
if(root.left == null){
return minDepth(root.right)+1;
}
if(root.right == null){
return minDepth(root.left)+1;
}
return Math.min(minDepth(root.left),minDepth(root.right))+1;
}
}
还有一点提醒就是,要把最根本,或者这个情况成立的情况,其他情况不成立的情况,最先考虑,比如所root为null的情况。(有点语无伦次,不理解也没有关系,反正我能懂吧?2333)。