Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-检查平衡性
实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
复制代码
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
复制代码
返回 false 。
二、思路分析:
思路一:
根据平衡性的定义,计算每个节点的左右子树高度。
如果某个节点的左右子树高度差大于1,则不平衡,返回false,结束;否则说明以当前节点为根的子树是平衡的,继续检查当前节点的左右子树的平衡性。
计算二叉树的高度
递归,当前二叉树的高度 = max(左子树高度, 右子树高度) + 1max(左子树高度,右子树高度)+1
左子树高度的计算方法相同
若当前节点为null,返回0,为递归出口
按照以上分解方法可以到达递归出口
思路二:
从顶至底,每个node判断一遍
思路三:
从底至顶,创建一个计算最大高度的方法,如果left和right相差大于1就返回-1
三、AC 代码:
四、总结:
思路一:
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
int leftTreeD = treeDepth(root.left);
int rightTreeD = treeDepth(root.right);
if (Math.abs(leftTreeD - rightTreeD) > 1) return false;
return isBalanced(root.left) && isBalanced(root.right);
}
public int treeDepth(TreeNode root) {
if (root == null) return 0;
return Math.max(treeDepth(root.left), treeDepth(root.right)) + 1;
}
}
复制代码
思路二:
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (Math.abs(check(root.left) - check(root.right)) > 1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
}
public int check(TreeNode root) {
if (root == null) {
return 0;
}
int maxLong = Math.max(check(root.left), check(root.right)) + 1;
return maxLong;
}
}
复制代码
思路三:
class Solution {
public boolean isBalanced(TreeNode root) {
return recursion(root) != -1;
}
private int recursion(TreeNode root) {
if (root == null) {
return 0;
}
int leftValue = recursion(root.left);
if (leftValue == -1) {
return -1;
}
int rightValue = recursion(root.right);
if (rightValue == -1) {
return -1;
}
if (Math.abs(leftValue - rightValue) > 1) {
return -1;
}
return Math.max(leftValue, rightValue) + 1;
}
}
复制代码