leetcode
leetcode 101 ~ 150
平衡二叉树

平衡二叉树

难度:

标签:

题目描述

给定一个二叉树,判断它是否是 平衡二叉树  

 

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

 

提示:

  • 树中的节点数在范围 [0, 5000]
  • -104 <= Node.val <= 104

代码结果

运行时间: 68 ms, 内存: 19.6 MB


/*
 * Java Stream 方式:
 * 1. 使用一个内部类保存树的深度和是否平衡。
 * 2. 使用递归和流处理来计算树的深度和是否平衡。
 */
import java.util.stream.*;
 
public class Solution {
    public boolean isBalanced(TreeNode root) {
        return checkHeight(root).isBalanced;
    }
 
    private NodeInfo checkHeight(TreeNode node) {
        if (node == null) return new NodeInfo(0, true);
        NodeInfo leftInfo = checkHeight(node.left);
        NodeInfo rightInfo = checkHeight(node.right);
        boolean isBalanced = leftInfo.isBalanced && rightInfo.isBalanced && Math.abs(leftInfo.depth - rightInfo.depth) <= 1;
        int depth = Math.max(leftInfo.depth, rightInfo.depth) + 1;
        return new NodeInfo(depth, isBalanced);
    }
 
    private static class NodeInfo {
        int depth;
        boolean isBalanced;
 
        NodeInfo(int depth, boolean isBalanced) {
            this.depth = depth;
            this.isBalanced = isBalanced;
        }
    }
}

解释

方法:

这个题解使用了递归的方法来判断二叉树是否平衡。对于每个节点,先递归计算其左右子树的高度,然后判断左右子树的高度差是否不超过1。如果高度差超过1,则说明以当前节点为根的子树不平衡,返回False。同时还要递归判断左右子树是否平衡。只有当前节点平衡且左右子树都平衡时,才说明以当前节点为根的子树是平衡的,返回True。

时间复杂度:

O(n^2)

空间复杂度:

O(n)

代码细节讲解

🦆
在解法中,为什么要在每个节点都重新计算其左右子树的高度,而不使用一个辅助数据结构来存储已经计算过的高度,以减少重复计算?
在本题解中,每次计算节点的平衡性时都重新计算高度,这确实导致了不必要的重复计算,增加了时间复杂度。使用一个辅助数据结构(如哈希表)来存储每个节点的高度可以避免重复计算,提高效率。不过,该题解可能是为了说明概念或简化实现。在实际应用或面试中,推荐使用带有缓存的方式来优化性能。
🦆
在递归调用`get_height`函数时,如果遇到极端不平衡的树(例如左重或右重),递归深度会有多深?这是否会影响算法的实际执行?
在极端不平衡的情况下,如完全倾斜的树(所有节点只有左子节点或只有右子节点),递归深度将与树的高度相同,即等于节点数。这种情况下,递归深度可以非常大,导致大量的栈空间使用,甚至可能引发栈溢出错误。因此,这种深度递归的方法在实际应用中可能会影响算法的性能和稳定性。
🦆
题解中使用了`max`函数来计算左右子树的最大高度,这是否意味着只要有一个子树不平衡,整个树就不平衡?
使用`max`函数是为了获取当前节点的最大高度,这是计算节点高度所必需的。然而,单单一个子树的不平衡并不会导致整个树不平衡,除非该不平衡子树影响了其上级节点。题解中同时检查节点两侧子树的高度差(不超过1)以及每个子树自身的平衡性。因此,整个树的平衡性是通过递归地检查所有节点的平衡性来确定的。
🦆
你能解释一下在节点为null时,高度返回0的逻辑依据是什么?
在二叉树的高度定义中,一个空树(null节点)的高度是0。这是因为高度通常定义为从节点到其最远子节点的边的最大数目,对于空树,没有节点,因此边的数目为0。这个定义是递归计算树高度的基础,有助于简化边界情况的处理。

相关问题

二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

 

示例 1:

 

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

 

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100