力扣第110题-平衡二叉树

539 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

前言

力扣第110题 平衡二叉树 如下所示:

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: true

示例 2:

输入: root = [1,2,2,3,3,null,null,4,4]
输出: false

一、思路

这一题还是比较简单实现的,像看到树这种数据结构很容易就能联想到使用 递归 来遍历整棵树。这样可以省去自己去在循环中自己去维护 的操作。

大致的思路分为以下几个步骤:

  1. 先找到 根节点 对应的 左子树右子树 的深度,然后进行比较,如深度相差大于 1 则返回 false 即可。如深度相差小于等于 1 则执行后续的步骤
  2. 再将 根节点的左孩子 视为 根节点1,再对比 根节点1 的左子树和右子树的深度。
  3. 再将 根节点的右孩子 视为 根节点2,再对比 根节点2 的左子树和右子树的深度。
  4. 直到整棵树(包括子树)的高度差都不大于 1,这棵树则为 平衡二叉树。反之,这棵树不为 平衡二叉树

图解算法

上面说的这种思想,其实是一种 自顶向下 的方法。就是从根节点出发,保证整棵树和所有的子树都能满足 高度差不大于1

此处以示例1中的树作为例子

  1. 比较根节点的左右子树高度差

此时,深度差不大于1,则继续向下选择左右子树。

image.png

  1. 选择节点 9 作为根节点

9 为叶子节点,无左右孩子,故跳过

image.png

  1. 选择节点 20 作为根节点

深度差不大于1,继续向下 image.png

  1. 分别选择节点 157 作为根节点

157 都为叶子节点,无左右孩子。

至此已将整棵树遍历完成,未出现深度差大于 1 的情况,故这棵树为 平衡二叉树

二、实现

实现代码

实现代码与思路中保持一致

    /**
     * 递归
     */
    public boolean isBalanced(TreeNode root) {
        if (root != null){
            if (Math.abs(getDeepLen(root.left, 0) - getDeepLen(root.right, 0)) > 1){
                return false;
            }else {
                return isBalanced(root.left) && isBalanced(root.right);
            }
        } else {
            return true;
        }
    }

    /**
     * 获取树的深度
     */
    private int getDeepLen(TreeNode root, int len){
        if (root == null)
            return len;
        len++;
        return Math.max(getDeepLen(root.left, len), getDeepLen(root.right, len));
    }

测试代码

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(3,
                new TreeNode(9),
                new TreeNode(20, new TreeNode(15), new TreeNode(7)));
        boolean flag = new Number110().isBalanced(treeNode);
        System.out.println(flag);
    }

结果

image.png

三、总结

虽然 自顶向下 的模式很容易被理解,但是会有很多重复计算的过程。所以不妨使用 自底向上 的模式来实现这一题,只要子树不满足条件,则这棵树一定不为 平衡二叉树

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~