LeetCode刷题小记——二叉树的最大深度

二叉树的最大深度

么事刷一刷

题目

image-20201206212803770

解法

思路:基于二叉树遍历的基础之上,带有层的信息即可。

方法:

  • 自顶向下(先序遍历)
  • 自底向上(后序遍历)

自顶向下

思路:孩子的层数总是根节点的层数+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. 对于当前节点,是否能确定一些参数,寻找结果?
  2. 是否能根据当前节点的状态,确定它孩子节点的一些参数?

如果答案是是,则可以 使用“自顶向下”的思想解决问题。

如本题,我能从判断当前节点是否为叶子结点,来确定深度;并且可以确定它孩子的深度(当前深度+1),继续递归。

就可以尝试使用自顶向下的方法。


自底向上

或者,如果你能根据子节点的答案,来得出当前节点的答案,则可以尝试使用“自底向上”的思想。

如本题,我可以根据子节点的深度,来得到当前节点的深度(孩子节点中最大深度+1);

递归看起来简单(简洁),想写好可不容易啊!

自底向上

或者,如果你能根据子节点的答案,来得出当前节点的答案,则可以尝试使用“自底向上”的思想。

如本题,我可以根据子节点的深度,来得到当前节点的深度(孩子节点中最大深度+1);

递归看起来简单(简洁),想写好可不容易啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值