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

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

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

来自力扣K神的解法1,真的是太巧妙了!

方法recur检查以node为根节点的树是不是平衡的;

使用-1标记"这个树不平衡",而如果树是平衡的,那么可以直接返回树的高度。如此一来,recur的返回值类型就可以统一为int。

java 复制代码
class Solution {
    public boolean isBalanced(TreeNode root) {
        return recur(root)!=-1;
    }
    public int recur(TreeNode node){
        if(node==null) return 0;

        int leftLen = recur(node.left);
        if(leftLen==-1) return -1;// 如果判断到左树是不平衡的,那么直接返回不平衡

        int rightLen = recur(node.right);
        if(rightLen==-1) return -1;

        return Math.abs(rightLen-leftLen)<=1?Math.max(leftLen,rightLen)+1:-1;
        
    }
}

来自力扣K神的解法2,一种比较自然的思路,首先算左树右树的深度,判断当前树是否满足"左子树深度与右子树深度相差不得超过1"的条件,然后判断左树右树是否是平衡树,对这三个boolean取&&,得到的结果即当前树是不是平衡树。

java 复制代码
class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root==null) return true;
        return Math.abs(depth(root.left)-depth(root.right))<=1&&isBalanced(root.right)&&isBalanced(root.left);

    }
    public int depth(TreeNode node){
        if(node==null) return 0;
        return Math.max(depth(node.left),depth(node.right))+1;
    }
}

下面的解法参考了左程云算法课上所介绍的关于二叉树题目的套路

java 复制代码
/**
 * 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;

        return func(root).isBal;

    }

    class info{// 左右孩子节点需要向父节点反馈info信息
        int leftLen;// 当前左树高度
        int rightLen;// 当前右树高度
        boolean isBal;// 当前结点为根节点的子树是否是平衡的

        public info(int l, int r, boolean isb){
            leftLen=l;
            rightLen=r;
            isBal=isb;
        }
    }

    public info func(TreeNode node){
        if(node==null){
            return new info(0,0,true);
        }

        info leftInfo = func(node.left);
        info rightInfo = func(node.right);
        
        int leftLen = Math.max(leftInfo.leftLen,leftInfo.rightLen)+1;
        int rightLen=Math.max(rightInfo.leftLen,rightInfo.rightLen)+1;
        boolean isBal = leftInfo.isBal&&rightInfo.isBal;
        if(isBal){
            isBal = Math.abs(leftLen-rightLen)<=1;
        }
        return new info(leftLen,rightLen,isBal);
    }

}
相关推荐
金融小师妹1 小时前
基于哈塞特独立性表态的AI量化研究:美联储政策独立性的多维验证
大数据·人工智能·算法
纪元A梦5 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
深圳市快瞳科技有限公司5 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle6 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
superlls8 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻8 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦8 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
Jayden_Ruan9 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法
点云SLAM10 小时前
C++ 常见面试题汇总
java·开发语言·c++·算法·面试·内存管理
叙白冲冲10 小时前
哈希算法以及面试答法
算法·面试·哈希算法