import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/*
平衡二叉树:对于任何一个节点来说,他的左右子树高度差不能超过1;
解题思路:直接DFS遍历每一节点,判断节点的左右子树的高度差。如果超过1,直接不是平衡二叉树。
*/
public boolean isBalanced (TreeNode root) {
if(root==null) return true;
return dfs(root);
}
public boolean dfs(TreeNode root){
// 获取当前节点的左子树高度
int leftHeight = getHeight(root.left);
// 获取当前节点的右子树高度
int rightHeight = getHeight(root.right);
// 比较左右子树高度差
if(Math.abs(leftHeight-rightHeight)>1) return false;
// 假设左右子树都合法;
boolean leftSign=true;
boolean rightSign=true;
// 递归左子树
if(root.left!=null){
leftSign = dfs(root.left);
}
// 递归右子树
if(root.right!=null){
rightSign = dfs(root.right);
}
// 只有当前节点的左右子树都合法,才说明当前节点合法
if(leftSign && rightSign){
return true;
}else{
return false;
}
}
// 获取一个节点的高度
public int getHeight(TreeNode root){
if(root==null) return 0;
return Math.max(getHeight(root.left),getHeight(root.right))+1;
}
// 如果以上代码看得懂!判断平衡二叉树可以简化成这样写。
public boolean isBalanced (TreeNode root) {
// 递归终止条件
if(root==null) return true;
// 如果当前节点高度差合法, 并且当前节点的左子树是合法 并且 当前节点的右子树是合法
return Math.abs(getHeight(root.left)-getHeight(root.right))<=1 && isBalanced(root.left) && isBalanced(root.right); }
}