携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
一、题目
LeetCode II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。
限制:
0 <= 树的结点个数 <= 10000
二、题解
给定一个二叉树,判断改二叉树是不是平衡二叉树,平衡二叉树就是子树节点的高度差不能超过1,对于子树的子树也是这样的,那么就是平衡二叉树。
方法一
对此可以通过递归遍历二叉树来校验,计算每个节点路径的高度,然后判断左右子树的高度差,如果左右子树的高度差不超过1的话就继续遍历。具体的首先需要计算出一个子树的高度,
这里可以使用dfs深度优先搜索来遍历计算高度,递归方法getHeight
计算树高度,如果root
树节点为空就返回高度0,否则递归的计算root
树的左子树高度和root
树的右子树高度,保留最大的一个子树高度,最终返回计算的高度加一。
然后就可以判断是否平衡二叉树了,如果root
树节点为空则返回true表示也算是平衡二叉树,否则就计算左子树的高度和右子树的高度差,如果高度差大于1的话就不是平衡二叉树,否则有可能是平衡二叉树,还
需要递归的判断左子树节点和右子树节点。
方法二
方法一可能会重复的计算的节点路径高度,因此可以后序遍历二叉树计算树高度返回来判断。
三、代码
方法一 Java代码
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (Math.abs(getHeight(root.left) - getHeight(root.right)) > 1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
}
public int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
}
时间复杂度:O(n^2),需要先计算树高度和遍历子树判断。
空间复杂度:O(n),递归的消耗栈空间。
方法二 Java代码
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root) >= 0;
}
private int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
int left = getHeight(root.left);
if (left == -1) {
return -1;
}
int right = getHeight(root.right);
if (right == -1) {
return -1;
}
if (Math.abs(left - right) > 1) {
return -1;
}
return Math.max(left, right) + 1;
}
}
时间复杂度:O(n),需要遍历二叉树节点。
空间复杂度:O(n),递归的消耗栈空间。