← 返回题目列表

什么是左倾红黑树(LLRB)?它和普通红黑树有什么区别?

困难 第 24 / 25 题 更新于 2026/07/30
红黑树LLRB2-3树左倾

简化版

左倾红黑树是红黑树的一种简化变体,要求红链接尽量向左倾斜,用红链接表示 2-3 树中的 3-node。它把插入修复归纳成左旋、右旋、颜色翻转三类操作,代码比传统红黑树更容易统一。

详细版

LLRB(Left-Leaning Red-Black Tree)通常把红色看成「父节点与子节点之间的链接颜色」。核心规则:

  • 红链接只能向左倾斜;
  • 不允许一个节点同时连接两条连续红链接;
  • 完全黑平衡,对应 2-3 树的平衡性。

插入时新节点为红色,然后局部修复:

  1. 若右链接为红且左链接不红,左旋;
  2. 若左链接为红且左孩子的左链接也红,右旋;
  3. 若左右链接都红,颜色翻转。

LLRB 的思想是把普通红黑树的复杂 case 压缩成固定的局部规则,更适合教学和简洁实现。

完整版教学

一、为什么会有 LLRB

传统红黑树插入删除有很多镜像情况:叔叔红、叔叔黑、左左、左右、右右、右左。它性能很好,但实现和记忆成本高。LLRB 的目标是用更少的规则表达同样的平衡思想,尤其让插入代码变得接近递归 BST 插入后的三步修复。

LLRB 的「左倾」不是数学必然,而是一种约定:把表示 3-node 的红链接统一放在左边。统一方向后,右倾红链接就被视为需要旋转修正的临时状态。

记忆钩子:LLRB 是给红链接定了交通规则:能左不右,右倾就旋回来。

二、红链接和 2-3 树的关系

LLRB 常用红链接表示 2-3 树里的 3-node。一个黑节点和它的左红孩子可以合起来理解成一个含 2 个 key 的 3-node。这样二叉树结构就能模拟多路平衡树结构。

2-3树中的 [a|b]
可表示为:
    b(B)
   /
 a(R)

这里红色不是说节点本身危险,而是表示它和父节点逻辑上属于同一个 3-node。要求红链接左倾,就是统一用左红孩子来编码 3-node。

三、插入修复的三条规则

LLRB 插入后通常按固定顺序修复:

if (isRed(h.right) && !isRed(h.left)) h = rotateLeft(h);
if (isRed(h.left) && isRed(h.left.left)) h = rotateRight(h);
if (isRed(h.left) && isRed(h.right)) flipColors(h);

第一条修正右倾红链接。第二条修正连续左红链接,避免 4-node 表示失控。第三条把临时 4-node 向上分裂,相当于 2-3 树节点分裂。三条规则组合起来,让树既保持 BST 中序,又保持黑平衡。

四、用数字例子看插入

插入 1,2,3。插入 1 后根变黑。插入 2 时,2 作为 1 的右红孩子,出现右倾红链接,需要左旋,变成 2 黑、1 红。插入 3 后,2 的左右孩子都红,颜色翻转,2 变红,1 和 3 变黑,最后根再染黑。

步骤局部问题修复
右孩子红、左孩子黑右倾红链接左旋
左孩子红且左左红连续红链接右旋
左右孩子都红临时 4-node颜色翻转

这个过程和 2-3 树插入分裂非常接近,只是用二叉树旋转表达。

五、LLRB 和普通红黑树的区别

普通红黑树允许红节点作为左孩子或右孩子,只要不出现红红相连并满足黑高一致即可。LLRB 额外要求红链接左倾,因此它是更受限制的一类红黑树表示。限制更强的好处是实现规则更统一,坏处是某些操作可能需要更多旋转来维护左倾约束。

维度普通红黑树LLRB
红链接方向左右都可倾向左侧
教学实现case 较多规则较少
对应模型2-3-4 树常见2-3 树常见
工程使用TreeMap 等常见教学和简洁实现常见

面试里如果不是专门问 LLRB,不要把它和工业红黑树实现混为一谈。

六、删除为什么仍然不简单

LLRB 插入非常优雅,但删除仍然有复杂度。删除过程中要确保沿搜索路径不会进入 2-node,否则删除后可能破坏黑平衡。常见实现会在向下递归时提前做 moveRedLeftmoveRedRight,把红链接借到需要的方向。

这说明 LLRB 不是让红黑树所有操作都变成傻瓜题,而是把规则体系换成更统一的 2-3 树视角。理解这个视角,比硬背每个删除函数更重要。

七、常见误区与追问

  • 误区:LLRB 是另一种完全不同的数据结构。 它仍是红黑树思想的一种变体和编码方式。
  • 追问:为什么红链接要左倾? 为了统一表示 2-3 树中的 3-node,减少镜像 case。
  • 误区:LLRB 的节点红色和普通红黑树意义完全一样。 LLRB 更强调链接颜色,用红链接表示节点合并关系。
  • 追问:LLRB 插入三步是什么? 右红左黑左旋、左左红右旋、左右都红颜色翻转。
  • 误区:LLRB 删除也很简单。 删除仍需处理向下借红链接和黑平衡维护。

八、加强记忆

LLRB 可以记成「红链接代表 3-node,统一向左倒」。它通过左旋修正右红,通过右旋修正连续左红,通过颜色翻转拆分临时 4-node。它和普通红黑树的目标一样,都是保证对数高度;区别在于 LLRB 给红链接加了左倾约束,让插入规则更像 2-3 树的局部分裂。