校招算法面试-判断是不是平衡二叉树

校招算法面试-判断是不是平衡二叉树
最新回答
七米海岸

2026-10-22 09:04:20

判断平衡二叉树的算法可以通过自顶向下或自底向上的方法实现。平衡二叉树要求任意节点的左右子树深度差不超过1,且子树也需满足平衡条件。以下是两种方法的详细说明及代码实现:

方法一:自顶向下(推荐)思路
  1. 递归遍历每个节点,计算其左右子树的深度。
  2. 检查深度差:若左右子树深度差绝对值超过1,则不平衡。
  3. 递归检查子树:确保左右子树本身也是平衡的。
代码实现public class Solution { // 计算子树深度 public int deep(TreeNode root) { if (root == null) return 0; int left = deep(root.left); int right = deep(root.right); return Math.max(left, right) + 1; } public boolean IsBalanced_Solution(TreeNode root) { if (root == null) return true; int left = deep(root.left); int right = deep(root.right); if (Math.abs(left - right) > 1) return false; return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right); }}复杂度分析
  • 时间复杂度:O(n2)(最坏情况下,如链表状树需重复计算深度)。
  • 空间复杂度:O(n)(递归栈深度)。
方法二:自底向上(优化)思路
  1. 递归计算深度的同时检查平衡性,避免重复计算。
  2. 提前终止:若子树不平衡,直接返回-1,不再继续计算。
代码实现public class Solution { public boolean IsBalanced_Solution(TreeNode root) { return getDepth(root) != -1; } private int getDepth(TreeNode root) { if (root == null) return 0; int left = getDepth(root.left); if (left == -1) return -1; // 左子树不平衡 int right = getDepth(root.right); if (right == -1) return -1; // 右子树不平衡 return Math.abs(left - right) > 1 ? -1 : Math.max(left, right) + 1; }}复杂度分析
  • 时间复杂度:O(n)(每个节点仅访问一次)。
  • 空间复杂度:O(n)(递归栈深度)。
关键点总结
  1. 平衡条件:任意节点左右子树深度差≤1,且子树必须平衡。
  2. 自顶向下:直观但效率低,适合理解问题。
  3. 自底向上:优化后效率更高,推荐实际使用。
图示说明

自顶向下递归计算深度并检查平衡性

自底向上边计算深度边检查平衡性

通过以上方法,可以高效判断二叉树是否平衡,并根据实际需求选择合适实现。