110.平衡二叉树
后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili
给定一个二叉树,判断它是否是
平衡二叉树
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true示例 2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false示例 3:
输入:root = [] 输出:true提示:
- 树中的节点数在范围
[0, 5000]
内-104 <= Node.val <= 104
第一反应是应用昨天学到的二叉树的最大深度和最小深度,求两者之差,与1比较,<=1则是平衡二叉树,大于1则不是平衡二叉树。
但看了卡哥的视频,发现自己有很多考虑不太周道的地方。
平衡二叉树的含义是:该二叉树的所有节点的左右子树的高度差相差不超过1。
如果有节点的左右子树的高度差超过1,则返回-1,说明这棵二叉树已经不是平衡二叉树。
理想的遍历状态如下:
左右中 搜集左右孩子节点的信息后,需要把信息返回给中间节点,然后中间节点再接着把信息向上传递,所以适合后序遍历的方式
用递归的方式来进行后续遍历:
递归三部曲:
1、确定函数的参数和返回值:
参数是传入的根节点,返回值是:以当前传入的节点为根节点的树的高度
注意:如果以当前传入的节点为根节点的树的高度>1,则这棵树就已经不是平衡二叉树了,返回-1
private int getHeight(TreeNode root){
}
2、确定返回条件:
if(root == null){
return 0;
}
3、确定单层递归的逻辑:左右中:先计算左子树的高度,再计算右子树的高度,再计算两者之差,如果差大于1,则返回-1,表示这棵树不是平衡二叉树;如果差小于等于1,则返回左右子树的高度的最大值加1,表示当前节点的高度
int leftHeight = getHeight(root.left);
if(leftHeight == -1){
return -1;
}
int rightHeight = getHeight(root.right);
if(rightHeight == -1){
return -1;
}
if(Math.abs(leftHeight-rightHeight)>1){
return -1;
}
return Math.max(leftHeight,rightHeight)+1;
综合代码:
class Solution {
/**
* 递归法
*/
// 定义一个公共方法,用于判断给定的二叉树是否是平衡树
public boolean isBalanced(TreeNode root) {
// 调用 getHeight 方法来获取二叉树的高度,如果返回的高度不为 -1,则说明是平衡树,返回 true,否则返回 false
return getHeight(root) != -1;
}
// 定义一个私有方法,用于获取二叉树的高度
private int getHeight(TreeNode root) {
// 如果根节点为空,返回高度为 0
if (root == null) {
return 0;
}
// 递归计算左子树的高度
int leftHeight = getHeight(root.left);
// 如果左子树的高度为 -1,表示左子树不平衡,直接返回 -1
if (leftHeight == -1) {
return -1;
}
// 递归计算右子树的高度
int rightHeight = getHeight(root.right);
// 如果右子树的高度为 -1,表示右子树不平衡,直接返回 -1
if (rightHeight == -1) {
return -1;
}
// 如果左右子树的高度差大于 1,表示不平衡,返回 -1
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1;
}
// 返回左右子树中较大的高度加上根节点的高度
return Math.max(leftHeight, rightHeight) + 1;
}
}