Appearance
55-II.平衡二叉树
题目描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路分析
深度优先遍历
AC 代码
自顶向下递归
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
// 注意 isBalanced(root.left) && isBalanced(root.right)
// 题目是要求任意节点的左右子树的深度相差不超过1
// 所以需要左右子树也是平衡树
return Math.abs(dfs(root.left) - dfs(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}
public int dfs(TreeNode root){
// base case
if(root == null) return 0;
// 获得左右子树的层数,比较大小,取大者,+1
return Math.max(dfs(root.left),dfs(root.right)) + 1;
}
}
自下向上递归
class Solution {
public boolean isBalanced(TreeNode root) {
// 如果height(root)为-1,则不是平衡树,如果是返回树的高度
return height(root) >= 0;
}
public int height(TreeNode root){
// base case
if(root == null) return 0;
// 获取左右子树的高度
int leftHeight = height(root.left);
int rightHeight = height(root.right);
// -1表示不是平衡树
// 如果左或右子树不是平衡树,或者左右子树的差值大于1,说明该树不是平衡树,返回-1
if(leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1){
return -1;
}
// 是的话,返回树的高度
return Math.max(leftHeight,rightHeight) + 1;
}
}