二叉树的最大深度
么事刷一刷
题目

解法
思路:基于二叉树遍历的基础之上,带有层的信息即可。
方法:
- 自顶向下(先序遍历)
- 自底向上(后序遍历)
自顶向下
思路:孩子的层数总是根节点的层数+1,所以当我们遍历到叶子节点时,更新最大层数值即可。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int max = 0;//全局变量,最大深度
public int maxDepth(TreeNode root) {
getMaxDepth(root,1);
return max;
}
public void getMaxDepth(TreeNode root,int depth){
if(root == null) return ;
if(root.left == null && root.right == null)//到达叶子节点,更新深度
if(depth>max) max = depth; //更新深度
//非叶子节点,则处理孩子节点
getMaxDepth(root.left,depth+1);
getMaxDepth(root.right,depth+1);
}
}
自底向上
思路:与自顶向下相反,我们知道当前子树根节点的深度,是孩子节点中最大深度+1,空节点深度为0。
那么我们遍历到最深度,空节点深度为0,再自底向上回去,每棵子树都是左右孩子中最大深度+1。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
int max = getMaxDepth(root);
return max;
}
public int getMaxDepth(TreeNode root){
if(root == null) return 0; //空节点深度为0
int left = getMaxDepth(root.left);
int right = getMaxDepth(root.right);
return (left>right? left:right)+1;//孩子的最大层数,加上1为当前子树深度
}
}
总结
对于此题来说,两种思想都可以解决问题,但是有些问题,可能用其中的一种会更好。
自顶向下
如果遇到树的问题,思考一下:
- 对于当前节点,是否能确定一些参数,寻找结果?
- 是否能根据当前节点的状态,确定它孩子节点的一些参数?
如果答案是是,则可以 使用“自顶向下”的思想解决问题。
如本题,我能从判断当前节点是否为叶子结点,来确定深度;并且可以确定它孩子的深度(当前深度+1),继续递归。
就可以尝试使用自顶向下的方法。
自底向上
或者,如果你能根据子节点的答案,来得出当前节点的答案,则可以尝试使用“自底向上”的思想。
如本题,我可以根据子节点的深度,来得到当前节点的深度(孩子节点中最大深度+1);
递归看起来简单(简洁),想写好可不容易啊!
自底向上
或者,如果你能根据子节点的答案,来得出当前节点的答案,则可以尝试使用“自底向上”的思想。
如本题,我可以根据子节点的深度,来得到当前节点的深度(孩子节点中最大深度+1);
递归看起来简单(简洁),想写好可不容易啊!
297

被折叠的 条评论
为什么被折叠?



