二叉搜索树是二叉树的特例,平衡二叉树则是二叉搜索树的特例。

# 什么是平衡二叉树

⚡ 30 秒速记

  • 高度平衡二叉树要求每个结点的左右子树高度差绝对值不超过 1,不是只检查根结点
  • 高度是从叶子向父结点汇总的信息,使用后序遍历可同时计算高度并判断平衡
  • 空树通常视为平衡且高度为 0;叶子高度取 1,定义统一后差值判断才不会偏一

平衡二叉树,也叫 AVL Tree,是任意结点左右子树高度差的绝对值都不超过 1 的二叉搜索树。 关键在“任意结点”,不能只看根结点是否平衡;只要某个内部结点超过这个范围,整棵树就不满足定义。它同时保留二叉搜索树的排序约束,并额外限制树的高度差。

在上一节的末尾,我们已经通过一道真题和平衡二叉树打过交道。正如题目中所说,平衡二叉树(又称 AVL Tree)指的是任意结点的左右子树高度差绝对值都不大于1的二叉搜索树。

💬 面试官追问

  • 搜索页面展示一棵每个结点左右高度差都不超过 1 的普通二叉树,候选人直接称它为 AVL Tree,你会用什么结构性反例追问?

    仅满足左右子树高度差不超过 1,只能说明它具备高度平衡性质,还不能据此认定为 AVL Tree。按照题目采用的定义,AVL Tree 还必须是二叉搜索树;只要构造一个左孩子键值大于根结点的平衡结构,就能反驳该判断。

  • 后台树结构校验接口需要判断十万级结点是否平衡,同事准备对每个结点分别调用一次求高度函数,你会怎样改写核心逻辑?

    应使用一次后序遍历,让每个结点在获得左右子树高度后立即判断高度差,并向父结点返回当前高度。发现差值绝对值大于 1 时可返回失衡哨兵并提前结束;这样避免对子树反复求高,但递归实现仍需关注极深异常输入的栈风险。

  • 配置中心原先存放二叉搜索树,现在产品允许批量导入任意二叉树,但验收仍写着“通过平衡校验即为 AVL Tree”,你会如何拆分约束?

    需要把校验拆成搜索次序与高度平衡两部分:前者验证结点键值满足二叉搜索树约束,后者验证任意结点左右子树高度差绝对值不超过 1。批量导入放宽了结构来源,却没有自动保留搜索性质;只通过高度检查时,结果不能标记为 AVL Tree。

  • 线上健康检查把一棵明显倾斜的树判为平衡树,日志显示叶子高度有时记为 0、有时记为 1,你会怎样排查判定逻辑?

    先统一空树与叶子结点的高度约定,并确认父结点高度始终由左右子树最大高度加一得到。只要整套计算前后一致,采用哪种常见起点通常不会改变高度差;若结果仍错误,应检查是否漏验深层结点,或把差值判断误写成仅检查根结点。

  • 数据库索引方案评审中,一方认为完全二叉树与平衡二叉搜索树可以互换,另一方只关心最后一层从左填充,你会怎样澄清两类结构的取舍?

    完全二叉树强调结点按层连续、最后一层从左填充,因此适合用数组和父子下标关系表达;平衡二叉搜索树强调搜索次序及每个结点的高度差约束。完全二叉树通常具有高度平衡外形,但未必满足搜索次序;AVL Tree 也不要求最后一层连续,二者不能按名称互换。

webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部