输⼊⼀棵节点数为 n ⼆叉树,判断该⼆叉树是否是平衡⼆叉树。
在这⾥,我们只需要考虑其平衡性,不需要考虑其是不是排序⼆叉树
平衡⼆叉树( Balanced Binary Tree ),具有以下性质:它是⼀棵空树或它的左右两个⼦树的⾼度差的绝对值不超过 1 ,并且左右两个⼦树都是⼀棵平衡⼆叉树。
样例解释:

平衡树意味着我们需要对⽐任何在同⼀个根下的左右⼦树的⾼度差,还记得之前我们计算树的⾼度么,使⽤递归⽅式来解决,其实这道题与算⾼度差不多,只是两边⾼度需要算出⼀个差值。
算法的主要思想:
public class Solution79 {
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) return true;
// 当前左右⼦树是否平衡以及左右⼦树分别是否平衡
return Math.abs(depth(root.left) - depth(root.right))
上⾯的计算,仔细观察就会发现会有很多重复计算的过程,⽐如下⾯的数,计算⼦树深度的时候,计算 1 的左⼦树,和计算 2 的,基本都重复了。

应该如何避免这种重复计算呢?前⾯的是⾃顶向下的⽅式,因为每个节点都得把⼦树计算⼀遍才需要重复,如果我们从下往上计算,那不就避免了重复计算。后序遍历,先判断子树平衡性,再判断当前节点,对⽐逻辑如下:
public class Solution79 {
public boolean IsBalanced_Solution(TreeNode root) {
// 空树
if (root == null) {
return true;
}
return getHeight(root) != -1;
}
public int getHeight(TreeNode root) {
if (root == null) {
return 0;//空节点高度为0
}
// 左⼦树的⾼度
int left = getHeight(root.left);
if (left 1 ? -1 : 1 + Math.max(left, right);
}
}
笔试面试时,建议首选这个方式,效率最优,代码简洁
通过自定义类同时返回高度和平衡信息,代码结构更清晰。
class BalanceInfo {
boolean isBalanced;
int height;
BalanceInfo(boolean isBalanced, int height) {
this.isBalanced = isBalanced;
this.height = height;
}
}
public class Solution {
public boolean isBalanced(TreeNode root) {
return checkBalance(root).isBalanced;
}
private BalanceInfo checkBalance(TreeNode node) {
if (node == null) {
return new BalanceInfo(true, 0); // 空节点平衡且高度为0
}
// 递归检查左右子树
BalanceInfo leftInfo = checkBalance(node.left);
BalanceInfo rightInfo = checkBalance(node.right);
// 如果子树不平衡,直接返回
if (!leftInfo.isBalanced || !rightInfo.isBalanced) {
return new BalanceInfo(false, -1); // 高度值此时不重要
}
// 检查当前节点是否平衡
if (Math.abs(leftInfo.height - rightInfo.height) > 1) {
return new BalanceInfo(false, -1);
}
// 返回当前节点的平衡信息和高高度
int currentHeight = Math.max(leftInfo.height, rightInfo.height) + 1;
return new BalanceInfo(true, currentHeight);
}
}
本文来自在线网站:seven的菜鸟成长之路,作者:seven,转载请注明原文链接:www.seven97.top
登录查看全部
参与评论
手机查看
返回顶部