leetCode——二叉树刷题——平衡二叉树
平衡二叉树
地址:https://leetcode.cn/problems/balanced-binary-tree/description/
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean isBalanced(TreeNode root) {//首先判断的就是根节点if(root == null) {return true;}//然后判断的是左节点return isHeight(root) >= 0;}public int isHeight(TreeNode root){if(root == null) {return 0;}int lf = isHeight(root.left);//如果说你这个中间已经不是平衡二叉树了就可以直接返回-1,进行判断了if(lf < 0) {return -1;}
int rf = isHeight(root.right);if(rf >= 0 && lf >= 0 && Math.abs(lf-rf) <= 1){return Math.max(lf,rf) + 1;}else {return -1;}}}
明确高度定义
二叉树的 “高度” 指从当前节点到其最远叶子节点的路径上的节点数量。例如:
- 空树的高度为 0;
- 只有一个根节点的树,高度为 1;
- 若根节点有左子树(高度 2)和右子树(高度 1),则根节点的高度为 1 + max(2, 1) = 3。
核心判断逻辑(递归实现)
通过一个辅助方法同时完成两件事: - 计算当前节点的高度;
- 在计算高度的过程中,判断当前节点的左右子树是否平衡。
具体步骤如下:
步骤 1:处理空树
- 如果当前节点为 null(空树),则它的高度为 0,且必然是平衡的,直接返回 0。
步骤 2:递归计算左子树高度
-
调用辅助方法计算左子树的高度。如果左子树返回 -1(标记为不平衡),说明左子树已经不符合平衡条件,当前树也必然不平衡,直接返回
-1(提前终止递归)。
步骤 3:递归计算右子树高度 -
同理,调用辅助方法计算右子树的高度。如果右子树返回 -1,直接返回 -1。
步骤 4:判断当前节点是否平衡
比较左、右子树的高度差:
-
若高度差的绝对值 > 1:当前节点的左右子树不平衡,返回 -1;
-
若高度差的绝对值 ≤ 1:当前节点平衡,返回当前节点的高度(1 + max(左子树高度, 右子树高度))。
步骤 5:最终判断整棵树是否平衡
- 主方法(isBalanced)调用辅助方法后,若返回值 ≠ -1,说明整棵树的所有节点都满足平衡条件,返回 true;否则返回 false。
这个题 很简单就是说白了,依旧是用递归然后,判断他的高度,然后返回高度值是多少,然后判断高度差的绝对值是不是1 ,这里加了一个就很好的点是什么,一开始是没有在下面这个,按这个的时间复杂度是O(n*n),因为有重复的计算,但是加了一个这个再每一次递归的走到这里的时候就可以重新判断高度差是不是好是1,如果不是直接结束了
//的核心作用是提前终止无效递归,避免重复计算,从而将时间复杂度从 O (n²) 优化到 O (n)。if(lf < 0) {return -1;}