剑指Offer【39】-- 平衡二叉树

【刷题笔记】
Github仓库地址:https://github.com/Damaer/codeSolution
笔记地址:https://damaer.github.io/codeSolution/

题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

示例1

输入

{1,2,3,4,5,6,7}

返回值

true

思路以及解答

这道题沿用了上一道【树的深度】的思路,何为平衡二叉树,也就是树的左右两个子树的深度相差不超过1,而且同时左右子树也要是平衡二叉树。譬如下面这个就是二叉树:

而这个不是平衡二叉树,节点3的左子树深度为2,右子树深度为0,两个子树的深度相差2。而如果单纯从根节点1开始,看左右子树的深度的话,就会发现节点1左右两个子树的深度相差1,是符合平衡二叉树的原则的。这也是为什么我们除了判断根节点的左右子树高度差绝对值相差1,还需要分别判断左右两个子树是否也符合平衡二叉树的判定规则。

既然要判断整棵树,也要分别判断两个子树,那么想到的肯定就是递归。判断流程大致如下:

    1. 判断根节点是否为null,为null直接返回true
    1. 根节点如果不为null,需要求出左子树的高度以及右子树的高度,如果两个相差大于1,则返回·false`。
    1. 如果两个子树的深度相差小于等于1,就需要分别判断左,右子树是否为平衡树。也就是以左右两个子节点为根节点,从第1步开始执行。

PS:判断树的深度的分析在上一篇中,有兴趣自己了解一下,也是使用递归,貌似图片东西多了就有点模糊,我的图片都是使用开源软件draw.io来画的,我会将源文件都开源在github中,画得丑见谅,后续有时间再完善了。

代码如下:

/**
 * @author wenhaoxu
 * @date 2021/1/29 14:48
 */
public class Solution39 {
    // 测试代码
    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1);
        treeNode.left = new TreeNode(2);
        treeNode.right = new TreeNode(3);

        treeNode.left.left =new TreeNode(4);
        treeNode.left.right = new TreeNode(5);
        treeNode.right.left = new TreeNode(6);
        treeNode.right.right = new TreeNode(7);
        Solution39 solution39 = new Solution39();
        boolean result = solution39.IsBalanced_Solution(treeNode);
        System.out.println(result);
    }
    public boolean IsBalanced_Solution(TreeNode root) {
        if (root != null) {
            int left = deep(root.left);
            int right = deep(root.right);
            if (Math.abs(left - right) > 1) {
                return false;
            } else {
                return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
            }
        }
        return true;
    }
    // 求树的深度
    public int deep(TreeNode node) {
        if (node == null) {
            return 0;
        }
        return Math.max(deep(node.left), deep(node.right)) + 1;
    }
}

class TreeNode {
    int val;
    public TreeNode left;
    public TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

【作者简介】
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。

2020年我写了什么?

开源编程笔记

平日时间宝贵,只能使用晚上以及周末时间学习写作,关注我,我们一起成长吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值