一文详解判断二叉树是否平衡

本文介绍了一种通过后序遍历判断二叉树是否平衡的方法。平衡二叉树的定义为任意节点的左右子树高度差不超过1。文章提供了一个具体的Java实现案例。

1 前言 

LeetCode链接

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

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

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

2 实现

2.1 分析

  • 如果此时我们知道左子树的高度,然后知道右子树的高度后,此时我们到了根节点,我们是不是可以判断左子树高度与右子树的高度差,来判断是否是平衡二叉树呢?(以上遍历方式我们可以看出,是左右中,是后序遍历。)
  • 假如说,我们在遍历左子树的时候发现,左子树已经不平衡了,那么右子树是不是就不用判断了呢?直接返回就可以,该树肯定是不平衡的。因此我们需要一个标记位。

综上,我们需要进行后序遍历,然后需要一个标记位。

2.2 代码

package cn.msf.tree;

import static cn.msf.tree.MaxDepth.getMaxDepth;
import static cn.msf.tree.MinDepth.getMinDepth;

/**
 * @author : msf
 * @date : 2022/12/9
 * 判断一颗树是否是平衡二叉树,每个节点的左右两个子树的高度差绝对值不能超过1
 */
public class IsBalanced {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        TreeNode node1 = new TreeNode(2);
        TreeNode node2 = new TreeNode(3);
        TreeNode node3 = new TreeNode(4);
        TreeNode node4 = new TreeNode(5);
        TreeNode node5 = new TreeNode(6);
        TreeNode node6 = new TreeNode(7);

        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node1.right = node4;
        node2.left = node5;
        node2.right = node6;
        boolean balanced = new IsBalanced().isBalanced(root);
        System.out.println("该树是否是平衡树呢?" + balanced);
    }

    boolean isBalanced=true;
    public boolean isBalanced(TreeNode root) {
        getHeight(root);
        return isBalanced;
    }

    public  int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        // 剪枝
        if (!isBalanced) {
            return -1;
        }
        // 左
        int leftHeight = getHeight(root.left);
        // 右
        int rightHeight = getHeight(root.right);
        // 中--如果不成立 标记位为false
        if(Math.abs(rightHeight - leftHeight) > 1) {
            isBalanced = false;
        }
        // 中--如果成立,则继续计算 树的高度。
        return 1 + Math.max(leftHeight,rightHeight);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值