剑指 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);
    }

}
相关推荐
MartinYeung51 小时前
[论文学习]DP2Unlearning:高效且具保证的大型语言模型遗忘框架(基于差分隐私的 LLM Unlearning 方法)
学习·算法·语言模型
Tian_Hang2 小时前
C++原型模式(Protype)
开发语言·c++·算法
bIo7lyA8v2 小时前
算法复杂度的渐进分析与实际运行时间的差异的技术8
算法
yuan199972 小时前
欧拉梁静力与屈曲计算的 MATLAB 实现(有限差分法 + 解析解)
开发语言·算法·matlab
汉克老师3 小时前
GESP7级C++考试语法知识(二、指数函数(3、综合练习)
c++·算法·数学建模·指数函数·gesp7级·复利
林间码客4 小时前
04 ROC曲线与AUC:从零开始手动计算
大数据·人工智能·算法
Irissgwe4 小时前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树
IronMurphy4 小时前
【算法五十八】23. 合并 K 个升序链表
数据结构·算法·链表
思茂信息4 小时前
CST软件基于液态金属开关的方向图可重构天线
服务器·算法·重构·cst·仿真软件·电磁仿真