Sword55-II——平衡二叉树
方法1——前序遍历
- 思路:对于每一个节点,判断其左右子树的最大深度的绝对值小于等于1,即代表符合条件;继续对该节点的左子节点和右子节点进行递归即可
- 特殊情况与临界分析:根节点非空判断
- 终止条件:当前节点为空,深度返回0
- 步骤:
- 根节点非空判断
- 返回是否符合条件
- 当前节点的左子树深度和右子树深度的绝对值是否小于2
- 其左子节点是否符合条件
- 其右子节点是否符合条件
- 递归求深度方法(可参考上一题的方法)
- 终止条件:当前节点为空,深度为0
- 递归求解左右子树深度,等于左右子树深度的较大值加1
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
return (Math.abs(depth(root.left) - depth(root.right)) < 2) &&
(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;
}

方法2——后序遍历
- 思路:从底部开始,判断其左右子树深度绝对值是否小于2,满足则返回左右子树深度的较大值再加1,不满足则向上一直返回-1
- 特殊情况与临界分析:无,因为是从底部开始向上遍历的
- 终止条件:当前节点为空,深度为0
- 步骤:
- 判断递归方法返回的值是否为-1,不为-1代表是平衡二叉树
- 递归方法
- 参数:当前节点
- 终止条件:当前节点为空,深度为0
- 对其左子树递归,接收其结果
- 判断左子树递归结果是否为-1,若为-1,则向上返回-1
- 对其右子树递归,接收其结果
- 判断右子树递归结果是否为-1,若为-1,则向上返回-1
- 判断当前节点的左子树深度和右子树深度的绝对值是否小于2
- 满足,则返回左右子树深度的较大值加1
- 不满足,则返回-1
public boolean isBalanced(TreeNode root) {
return recur(root) != -1;
}
private int recur(TreeNode root) {
if (root == null) {
return 0;
}
int left = recur(root.left);
if (left == -1) {
return -1;
}
int right = recur(root.right);
if (right == -1) {
return -1;
}
return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
}
