给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
解题思路:
- 构建递归函数,对于当前遍历到的节点,先递归地判断当前节点的左右子树是否是平衡二叉树,再判断以当前节点为根的子树是否平衡。
- 如果一棵子树是平衡的,则返回其高度,否则返回 -1。
- 如果存在一棵子树不平衡,则整个二叉树一定不平衡。
public boolean isBalanced(TreeNode root) {
return process(root) != -1;
}
// 1. 构建递归函数
private int process(TreeNode node) {
// 2. 如果节点为空,是平衡二叉树,高度为0
if (node == null) return 0;
// 3. 递归判断左子树是否是平衡二叉树,返回其高度
int leftH = balanced(node.left);
// 4. 递归判断右子树是否是平衡二叉树,返回其高度
int rightH = balanced(node.right);
// 5. 如果左子树不平衡或者右子树不平衡或者高度差超过1,直接返回-1
if(leftH == - 1 || rightH == -1 || Math.abs(leftH - rightH) > 1) return -1;
// 6. 返回树的高度(左右子树的最大高度 + 1)
return Math.max(leftH, rightH) + 1;
}
时间复杂度:O(n),其中 n 是二叉树中的节点个数。每个节点的计算高度和判断是否平衡都只需要处理一次,最坏情况下需要遍历二叉树中的所有节点
空间复杂度:O(n),其中 n 是二叉树中的节点个数。空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过 n