「剑指Offer」Day18:搜索与回溯算法(中等)

剑指 Offer 55 - I. 二叉树的深度

题目描述

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

例如:给定二叉树[3,9,20,null,null,15,7],返回它的最大深度 3 。

🔗题目链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/

方法一:前序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int max;
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        getMaxDepth(root, 0);
        return max;
    }
    public void getMaxDepth(TreeNode root, int count){
        if(root == null){
            return;
        }
        count++; //记录节点数
        if(root.left == null && root.right == null){
            //遍历到叶子节点就更新最大深度
            max = Math.max(max, count);
            return;
        }
        getMaxDepth(root.left, count);
        getMaxDepth(root.right, count);
    }
}

方法二:后序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) { //自底向上,类似于后序遍历
        if(root == null){
            return 0;
        }
        int leftDepth = maxDepth(root.left); //当前节点左子树的深度
        int rightDepth = maxDepth(root.right); //右子树的深度
        return Math.max(leftDepth, rightDepth) + 1; //选择左右深度中最大的进行返回,+1是为了加上当前节点
    }
}

剑指 Offer 55 - II. 平衡二叉树

题目描述

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

思路

从上到下进行对各节点的左右子树进行判断,
  • 构造一个获取当前节点的最大深度的函数
  • 通过比较某子树的左右子树的深度差  是否成立,来判断某子树是否是平衡二叉树。
  • 从根节点开始,从上到下,先判断根节点的左右子树是否平衡,平衡就接着递归判断左节点和右节点的左右子树是否平衡,以此类推,若所有子树都平衡,则此树平衡。

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
        //判断当前子树是否平衡
        if(Math.abs(getMaxDepth(root.left) - getMaxDepth(root.right)) <= 1){
            //判断当前子树的左子树和右子树是否平衡
            return isBalanced(root.left) && isBalanced(root.right);
        }
        return false;
    }
    public int getMaxDepth(TreeNode root){ //获得任意节点的左右子树的最大深度
        if(root == null){
            return 0;
        }
        return Math.max(getMaxDepth(root.left), getMaxDepth(root.right)) + 1;
    }
}

全部评论

相关推荐

02-13 15:16
三江学院 运营
据说名字越长别人越关注你的昵称我觉得我要被关注了:完全看不出你到底干了什么 全是车轱辘话
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务