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

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

平衡二叉树(Balanced Binary Tree),又被称为AVL树,是一种特殊的二叉搜索树。在AVL树中任何节点的两个子树的高度最大差别为1,这样的二叉树就称为平衡二叉树平衡二叉树的查找操作的效率与普通二叉搜索树相同,但插入和删除操作则需要通过旋转来保持树的平衡。 以下是一个判断二叉树是否平衡二叉树的Python代码示例: ```python class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def isBalanced(root): """ :type root: TreeNode :rtype: bool """ def checkHeight(node): # 如果节点为空,返回高度为0 if not node: return 0 # 递归计算左右子树的高度 left_height = checkHeight(node.left) if left_height == -1: return -1 right_height = checkHeight(node.right) if right_height == -1: return -1 # 如果左右子树高度差大于1,则不是平衡树 if abs(left_height - right_height) > 1: return -1 # 返回当前节点的高度 return max(left_height, right_height) + 1 # 从根节点开始检查,如果高度为-1,说明不是平衡树 return checkHeight(root) != -1 # 构建一棵树用于测试 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(2) root.left.left = TreeNode(3) root.left.right = TreeNode(3) root.right.left = TreeNode(4) root.right.right = TreeNode(4) # 判断是否平衡二叉树 print(isBalanced(root)) # 应该输出 False,因为存在两个节点的子树高度差为2 ``` 这段代码中,`isBalanced` 函数用于判断一个二叉树是否平衡二叉树。它通过辅助函数`checkHeight`来递归地计算每个节点的高度,如果在计算过程中发现任何节点的左右子树高度差超过1,则该树不是平衡的,并立即返回-1作为高度。如果所有节点的左右子树高度差都不超过1,则返回该节点的高度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

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

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

打赏作者

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

抵扣说明:

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

余额充值