平衡二叉树
难度:
标签:
题目描述
给定一个二叉树,判断它是否是 平衡二叉树
示例 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`函数来计算左右子树的最大高度,这是否意味着只要有一个子树不平衡,整个树就不平衡?
▷🦆
你能解释一下在节点为null时,高度返回0的逻辑依据是什么?
▷