发布于 

剑指 Offer.II-平衡二叉树

剑指 Offer.II-平衡二叉树

题目链接

<剑指 Offer 55 - II. 平衡二叉树>

问题描述

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

个人解法(先序遍历 + 深度判断)

构造一个计算当前子树深度的函数,通过比较左右子树的差,判断子树是否为平衡二叉树,若所有子树都平衡,则此树平衡

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
// 计算保证所有子树都是平衡二叉树
// 计算根节点 左右子树高度是否符合平衡二叉树的条件
return Math.abs(depth(root.left) - depth(root.right)) <= 1 && 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;
}
}

官方解法(后续遍历 + 剪枝)

对二叉树做后序遍历,从底部返回二叉树的深度,若判断到当前子树不是平衡树,则直接对其进行剪枝,提前返回

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
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;
// 若当前子树正常 判断左右节点的高度是否符合要求 若符合 正常返回高度 若不符合 直接返回-1 在上层调用中触发剪枝
return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @John Doe 创建,使用 Stellar 作为主题。