何小豆儿在此 发表于 2025-11-19 07:25:04

剑指offer-39、均衡⼆叉树

题⽬形貌

输⼊⼀棵节点数为 n ⼆叉树,判断该⼆叉树是否是均衡⼆叉树。
在这⾥,我们只须要思量其均衡性,不须要思量其是不是排序⼆叉树
均衡⼆叉树( Balanced Binary Tree ),具有以下性子:它是⼀棵空树或它的左右两个⼦树的⾼度差的绝对值不凌驾 1 ,而且左右两个⼦树都是⼀棵均衡⼆叉树。
样例表明:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9zZXZlbjk3LWJsb2cub3NzLWNuLWhhbmd6aG91LmFsaXl1bmNzLmNvbS9pbWdzLzIwMjUwNTI1MTA1NjM0MS5wbmc=
思绪及解答

自顶向下递归(根本解法)

均衡树意味着我们须要对⽐任安在同⼀个根下的左右⼦树的⾼度差,还记得之前我们盘算树的⾼度么,使⽤递归⽅式来办理,实在这道题与算⾼度差不多,只是两边⾼度须要算出⼀个差值。
算法的重要头脑:

[*]不绝对⽐每两个节点的左右⼦树的最⼤⾼度差,留意取差的绝对值,须要⼩于便是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 &&
            IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
    }
    private int depth(TreeNode root) {
      if (root == null) {
            return 0;
      }
      // 递归获取深度
      return Math.max(depth(root.left), depth(root.right)) + 1;
    }
}

[*]时间复杂度 O(n) :每个节点盘算⼀次
[*]空间复杂度 O(n) :递归须要使⽤额外堆栈空间
笔试口试时,发起首选这个方式,服从最优,代码简便
封装信息法(面向对象思绪)

通过自界说类同时返回高度宁静衡信息,代码结构更清楚。
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 < 0) {
            return -1;//左子树不平衡,直接返回
      }
      // 右⼦树的⾼度
      int right = getHeight(root.right);
      if (right < 0) {
            return -1;//右子树不平衡,直接返回
      }
      
      // 检查当前节点是否平衡
      return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
    }
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 剑指offer-39、均衡⼆叉树