1. 题目
2. 思路
(1) 前序遍历
- 前序遍历相当于自顶向下判断,获取左右子树的高度,若高度之差大于1,则直接返回false,否则递归判断左右子树。
- 自顶向下的方法在计算左右子树的高度时会重复计算,第n层的结点会被重复计算n次。
(2) 后序遍历
- 后序遍历相当于自底向上判断,由于已经获取了左右子树的高度,因此只做判断即可。
- 定义一个全局变量用于记录结果,若结果已经为false,则无需判断,直接返回即可,相当于剪枝策略。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (Math.abs(depth(root.left) - depth(root.right)) > 1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
}
private int depth(TreeNode root) {
if (root == null) {
return 0;
}
return Math.max(depth(root.left), depth(root.right)) + 1;
}
}
class Solution1 {
private boolean res = true;
public boolean isBalanced(TreeNode root) {
postorder(root);
return res;
}
private int postorder(TreeNode root) {
if (!res || root == null) {
return 0;
}
int left = postorder(root.left);
int right = postorder(root.right);
if (Math.abs(left - right) > 1) {
res = false;
}
return Math.max(left, right) + 1;
}
}