Java基础快速入门:TreeSet底层数据结构——树

本文纲要

  1. 引言
  2. 树的基本结构:节点与二叉树
    2.1 节点的构成
    2.2 什么是二叉树
    2.3 树的基本术语
  3. 二叉查找树(二叉排序树)
    3.1 定义与特点
    3.2 添加节点过程
    3.3 代码演示:节点类与插入
  4. 平衡二叉树
    4.1 为什么需要平衡
    4.2 定义与判断
  5. 平衡二叉树的旋转机制
    5.1 左旋(Left Rotation)
    5.2 右旋(Right Rotation)
    5.3 左左、左右、右右、右左四种情况
  6. 总结

引言

在 Java 集合框架中,TreeSet 是一种有序的 Set 实现。它的底层数据结构是红黑树(一种自平衡的二叉查找树)。要深入理解 TreeSet 的工作原理,首先要掌握树结构的基础知识。

本文将从最基础的二叉树讲起,逐步过渡到二叉查找树、平衡二叉树,并详细讲解平衡二叉树维持平衡的核心操作------左旋与右旋。这些内容是理解 TreeMapTreeSet 底层实现的关键。

树的基本结构:节点与二叉树

1 ) 节点的构成

在树结构中,每一个元素称为一个节点(Node)。每一个节点通常包含四部分信息:

父节点的地址

自身存储的值

左子节点的地址

右子节点的地址

可以用如下 Java 类来表示:

java 复制代码
public class TreeNode {
   // 父节点 
   TreeNode parent;
   // 存储的值 
   int value;
   // 左子节点 
   TreeNode left;
   // 右子节点 
   TreeNode right;

   public TreeNode(int value) {
       this.value = value;
   }
}

一个节点如果没有父节点(即为根节点),则 parentnull;如果没有左子节点或右子节点,则相应的 leftrightnull

以下图为例:
#mermaid-svg-3IUxoHcixdkHh3nW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3IUxoHcixdkHh3nW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3IUxoHcixdkHh3nW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3IUxoHcixdkHh3nW .error-icon{fill:#552222;}#mermaid-svg-3IUxoHcixdkHh3nW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3IUxoHcixdkHh3nW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3IUxoHcixdkHh3nW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3IUxoHcixdkHh3nW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3IUxoHcixdkHh3nW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3IUxoHcixdkHh3nW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3IUxoHcixdkHh3nW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3IUxoHcixdkHh3nW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3IUxoHcixdkHh3nW .marker.cross{stroke:#333333;}#mermaid-svg-3IUxoHcixdkHh3nW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3IUxoHcixdkHh3nW p{margin:0;}#mermaid-svg-3IUxoHcixdkHh3nW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3IUxoHcixdkHh3nW .cluster-label text{fill:#333;}#mermaid-svg-3IUxoHcixdkHh3nW .cluster-label span{color:#333;}#mermaid-svg-3IUxoHcixdkHh3nW .cluster-label span p{background-color:transparent;}#mermaid-svg-3IUxoHcixdkHh3nW .label text,#mermaid-svg-3IUxoHcixdkHh3nW span{fill:#333;color:#333;}#mermaid-svg-3IUxoHcixdkHh3nW .node rect,#mermaid-svg-3IUxoHcixdkHh3nW .node circle,#mermaid-svg-3IUxoHcixdkHh3nW .node ellipse,#mermaid-svg-3IUxoHcixdkHh3nW .node polygon,#mermaid-svg-3IUxoHcixdkHh3nW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3IUxoHcixdkHh3nW .rough-node .label text,#mermaid-svg-3IUxoHcixdkHh3nW .node .label text,#mermaid-svg-3IUxoHcixdkHh3nW .image-shape .label,#mermaid-svg-3IUxoHcixdkHh3nW .icon-shape .label{text-anchor:middle;}#mermaid-svg-3IUxoHcixdkHh3nW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3IUxoHcixdkHh3nW .rough-node .label,#mermaid-svg-3IUxoHcixdkHh3nW .node .label,#mermaid-svg-3IUxoHcixdkHh3nW .image-shape .label,#mermaid-svg-3IUxoHcixdkHh3nW .icon-shape .label{text-align:center;}#mermaid-svg-3IUxoHcixdkHh3nW .node.clickable{cursor:pointer;}#mermaid-svg-3IUxoHcixdkHh3nW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3IUxoHcixdkHh3nW .arrowheadPath{fill:#333333;}#mermaid-svg-3IUxoHcixdkHh3nW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3IUxoHcixdkHh3nW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3IUxoHcixdkHh3nW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3IUxoHcixdkHh3nW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3IUxoHcixdkHh3nW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3IUxoHcixdkHh3nW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3IUxoHcixdkHh3nW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3IUxoHcixdkHh3nW .cluster text{fill:#333;}#mermaid-svg-3IUxoHcixdkHh3nW .cluster span{color:#333;}#mermaid-svg-3IUxoHcixdkHh3nW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3IUxoHcixdkHh3nW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3IUxoHcixdkHh3nW rect.text{fill:none;stroke-width:0;}#mermaid-svg-3IUxoHcixdkHh3nW .icon-shape,#mermaid-svg-3IUxoHcixdkHh3nW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3IUxoHcixdkHh3nW .icon-shape p,#mermaid-svg-3IUxoHcixdkHh3nW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3IUxoHcixdkHh3nW .icon-shape .label rect,#mermaid-svg-3IUxoHcixdkHh3nW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3IUxoHcixdkHh3nW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3IUxoHcixdkHh3nW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3IUxoHcixdkHh3nW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 节点 A

value:?

parent:null

left: B

right: C
节点 B

value:?

parent: A

left: null

right: null
节点 C

value:?

parent: A

left: null

right: null

A 的左子节点记录了 B 的地址,右子节点记录了 C 的地址;B 和 C 的父节点记录了 A 的地址。B 和 C 没有子节点,所以它们的左、右子节点均为 null。

2 ) 什么是二叉树

二叉树是指任意一个节点的子节点数量不超过 2 的树。子节点的数量在树结构中有一个专业术语叫做度(degree)。二叉树中每个节点的度 ≤ 2。

一个简单的二叉树示例:
#mermaid-svg-j8k88gLhOkv0RRbx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-j8k88gLhOkv0RRbx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-j8k88gLhOkv0RRbx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-j8k88gLhOkv0RRbx .error-icon{fill:#552222;}#mermaid-svg-j8k88gLhOkv0RRbx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-j8k88gLhOkv0RRbx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-j8k88gLhOkv0RRbx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-j8k88gLhOkv0RRbx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-j8k88gLhOkv0RRbx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-j8k88gLhOkv0RRbx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-j8k88gLhOkv0RRbx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-j8k88gLhOkv0RRbx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-j8k88gLhOkv0RRbx .marker.cross{stroke:#333333;}#mermaid-svg-j8k88gLhOkv0RRbx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-j8k88gLhOkv0RRbx p{margin:0;}#mermaid-svg-j8k88gLhOkv0RRbx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-j8k88gLhOkv0RRbx .cluster-label text{fill:#333;}#mermaid-svg-j8k88gLhOkv0RRbx .cluster-label span{color:#333;}#mermaid-svg-j8k88gLhOkv0RRbx .cluster-label span p{background-color:transparent;}#mermaid-svg-j8k88gLhOkv0RRbx .label text,#mermaid-svg-j8k88gLhOkv0RRbx span{fill:#333;color:#333;}#mermaid-svg-j8k88gLhOkv0RRbx .node rect,#mermaid-svg-j8k88gLhOkv0RRbx .node circle,#mermaid-svg-j8k88gLhOkv0RRbx .node ellipse,#mermaid-svg-j8k88gLhOkv0RRbx .node polygon,#mermaid-svg-j8k88gLhOkv0RRbx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-j8k88gLhOkv0RRbx .rough-node .label text,#mermaid-svg-j8k88gLhOkv0RRbx .node .label text,#mermaid-svg-j8k88gLhOkv0RRbx .image-shape .label,#mermaid-svg-j8k88gLhOkv0RRbx .icon-shape .label{text-anchor:middle;}#mermaid-svg-j8k88gLhOkv0RRbx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-j8k88gLhOkv0RRbx .rough-node .label,#mermaid-svg-j8k88gLhOkv0RRbx .node .label,#mermaid-svg-j8k88gLhOkv0RRbx .image-shape .label,#mermaid-svg-j8k88gLhOkv0RRbx .icon-shape .label{text-align:center;}#mermaid-svg-j8k88gLhOkv0RRbx .node.clickable{cursor:pointer;}#mermaid-svg-j8k88gLhOkv0RRbx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-j8k88gLhOkv0RRbx .arrowheadPath{fill:#333333;}#mermaid-svg-j8k88gLhOkv0RRbx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-j8k88gLhOkv0RRbx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-j8k88gLhOkv0RRbx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j8k88gLhOkv0RRbx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-j8k88gLhOkv0RRbx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j8k88gLhOkv0RRbx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-j8k88gLhOkv0RRbx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-j8k88gLhOkv0RRbx .cluster text{fill:#333;}#mermaid-svg-j8k88gLhOkv0RRbx .cluster span{color:#333;}#mermaid-svg-j8k88gLhOkv0RRbx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-j8k88gLhOkv0RRbx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-j8k88gLhOkv0RRbx rect.text{fill:none;stroke-width:0;}#mermaid-svg-j8k88gLhOkv0RRbx .icon-shape,#mermaid-svg-j8k88gLhOkv0RRbx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j8k88gLhOkv0RRbx .icon-shape p,#mermaid-svg-j8k88gLhOkv0RRbx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-j8k88gLhOkv0RRbx .icon-shape .label rect,#mermaid-svg-j8k88gLhOkv0RRbx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j8k88gLhOkv0RRbx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-j8k88gLhOkv0RRbx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-j8k88gLhOkv0RRbx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2
4
5
7
10
11
12
null
null

3 ) 树的基本术语

根节点(Root Node) :树的最顶层节点,没有父节点。

子节点(Child Node) :某个节点的直接后代。

父节点(Parent Node) :某个节点的直接前驱。

叶子节点(Leaf Node) :度为零的节点,没有子节点。

树的高度(Height) :树中节点的最大层数。

左子树 / 右子树:以根节点的左子节点为根的子树称为左子树,以右子节点为根的称为右子树。

以高度为 4 的二叉树为例:
#mermaid-svg-M8TALdpAxiLdqAbX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-M8TALdpAxiLdqAbX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-M8TALdpAxiLdqAbX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-M8TALdpAxiLdqAbX .error-icon{fill:#552222;}#mermaid-svg-M8TALdpAxiLdqAbX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-M8TALdpAxiLdqAbX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-M8TALdpAxiLdqAbX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-M8TALdpAxiLdqAbX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-M8TALdpAxiLdqAbX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-M8TALdpAxiLdqAbX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-M8TALdpAxiLdqAbX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-M8TALdpAxiLdqAbX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-M8TALdpAxiLdqAbX .marker.cross{stroke:#333333;}#mermaid-svg-M8TALdpAxiLdqAbX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-M8TALdpAxiLdqAbX p{margin:0;}#mermaid-svg-M8TALdpAxiLdqAbX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-M8TALdpAxiLdqAbX .cluster-label text{fill:#333;}#mermaid-svg-M8TALdpAxiLdqAbX .cluster-label span{color:#333;}#mermaid-svg-M8TALdpAxiLdqAbX .cluster-label span p{background-color:transparent;}#mermaid-svg-M8TALdpAxiLdqAbX .label text,#mermaid-svg-M8TALdpAxiLdqAbX span{fill:#333;color:#333;}#mermaid-svg-M8TALdpAxiLdqAbX .node rect,#mermaid-svg-M8TALdpAxiLdqAbX .node circle,#mermaid-svg-M8TALdpAxiLdqAbX .node ellipse,#mermaid-svg-M8TALdpAxiLdqAbX .node polygon,#mermaid-svg-M8TALdpAxiLdqAbX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-M8TALdpAxiLdqAbX .rough-node .label text,#mermaid-svg-M8TALdpAxiLdqAbX .node .label text,#mermaid-svg-M8TALdpAxiLdqAbX .image-shape .label,#mermaid-svg-M8TALdpAxiLdqAbX .icon-shape .label{text-anchor:middle;}#mermaid-svg-M8TALdpAxiLdqAbX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-M8TALdpAxiLdqAbX .rough-node .label,#mermaid-svg-M8TALdpAxiLdqAbX .node .label,#mermaid-svg-M8TALdpAxiLdqAbX .image-shape .label,#mermaid-svg-M8TALdpAxiLdqAbX .icon-shape .label{text-align:center;}#mermaid-svg-M8TALdpAxiLdqAbX .node.clickable{cursor:pointer;}#mermaid-svg-M8TALdpAxiLdqAbX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-M8TALdpAxiLdqAbX .arrowheadPath{fill:#333333;}#mermaid-svg-M8TALdpAxiLdqAbX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-M8TALdpAxiLdqAbX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-M8TALdpAxiLdqAbX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-M8TALdpAxiLdqAbX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-M8TALdpAxiLdqAbX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-M8TALdpAxiLdqAbX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-M8TALdpAxiLdqAbX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-M8TALdpAxiLdqAbX .cluster text{fill:#333;}#mermaid-svg-M8TALdpAxiLdqAbX .cluster span{color:#333;}#mermaid-svg-M8TALdpAxiLdqAbX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-M8TALdpAxiLdqAbX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-M8TALdpAxiLdqAbX rect.text{fill:none;stroke-width:0;}#mermaid-svg-M8TALdpAxiLdqAbX .icon-shape,#mermaid-svg-M8TALdpAxiLdqAbX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-M8TALdpAxiLdqAbX .icon-shape p,#mermaid-svg-M8TALdpAxiLdqAbX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-M8TALdpAxiLdqAbX .icon-shape .label rect,#mermaid-svg-M8TALdpAxiLdqAbX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-M8TALdpAxiLdqAbX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-M8TALdpAxiLdqAbX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-M8TALdpAxiLdqAbX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2
4
5
7
10
11
12
null
null
null
null
null
null
null
null

  • 第 1 层:节点 7
  • 第 2 层:节点 4、10
  • 第 3 层:节点 2、5、11
  • 第 4 层:节点 12

树的高度 = 层数 = 4。

  • 7 是根节点。
  • 4 是 7 的左子节点,10 是 7 的右子节点。
  • 蓝色虚线框住的部分(以 4 为根的子树)是根节点的左子树,高度为 3。
  • 绿色虚线框住的部分(以 10 为根的子树)是根节点的右子树,高度为 3。

二叉查找树(二叉排序树)

1 ) 定义与特点

普通的二叉树在存储数据时没有任何规律,查找某个节点需要遍历整棵树,效率很低。

为了提高查找效率,引入了二叉查找树(Binary Search Tree,BST),也称为二叉排序树或二叉搜索树。

二叉查找树必须满足:

  1. 首先是一棵二叉树(每个节点最多两个子节点)。
  2. 对于任意节点,其左子节点的值 < 该节点的值
  3. 对于任意节点,其右子节点的值 > 该节点的值

简单理解:任意节点从左到右依次增大

示例:
#mermaid-svg-IyJGfOi99TBKwjoY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IyJGfOi99TBKwjoY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IyJGfOi99TBKwjoY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IyJGfOi99TBKwjoY .error-icon{fill:#552222;}#mermaid-svg-IyJGfOi99TBKwjoY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IyJGfOi99TBKwjoY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IyJGfOi99TBKwjoY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IyJGfOi99TBKwjoY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IyJGfOi99TBKwjoY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IyJGfOi99TBKwjoY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IyJGfOi99TBKwjoY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IyJGfOi99TBKwjoY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IyJGfOi99TBKwjoY .marker.cross{stroke:#333333;}#mermaid-svg-IyJGfOi99TBKwjoY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IyJGfOi99TBKwjoY p{margin:0;}#mermaid-svg-IyJGfOi99TBKwjoY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IyJGfOi99TBKwjoY .cluster-label text{fill:#333;}#mermaid-svg-IyJGfOi99TBKwjoY .cluster-label span{color:#333;}#mermaid-svg-IyJGfOi99TBKwjoY .cluster-label span p{background-color:transparent;}#mermaid-svg-IyJGfOi99TBKwjoY .label text,#mermaid-svg-IyJGfOi99TBKwjoY span{fill:#333;color:#333;}#mermaid-svg-IyJGfOi99TBKwjoY .node rect,#mermaid-svg-IyJGfOi99TBKwjoY .node circle,#mermaid-svg-IyJGfOi99TBKwjoY .node ellipse,#mermaid-svg-IyJGfOi99TBKwjoY .node polygon,#mermaid-svg-IyJGfOi99TBKwjoY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IyJGfOi99TBKwjoY .rough-node .label text,#mermaid-svg-IyJGfOi99TBKwjoY .node .label text,#mermaid-svg-IyJGfOi99TBKwjoY .image-shape .label,#mermaid-svg-IyJGfOi99TBKwjoY .icon-shape .label{text-anchor:middle;}#mermaid-svg-IyJGfOi99TBKwjoY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IyJGfOi99TBKwjoY .rough-node .label,#mermaid-svg-IyJGfOi99TBKwjoY .node .label,#mermaid-svg-IyJGfOi99TBKwjoY .image-shape .label,#mermaid-svg-IyJGfOi99TBKwjoY .icon-shape .label{text-align:center;}#mermaid-svg-IyJGfOi99TBKwjoY .node.clickable{cursor:pointer;}#mermaid-svg-IyJGfOi99TBKwjoY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IyJGfOi99TBKwjoY .arrowheadPath{fill:#333333;}#mermaid-svg-IyJGfOi99TBKwjoY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IyJGfOi99TBKwjoY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IyJGfOi99TBKwjoY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IyJGfOi99TBKwjoY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IyJGfOi99TBKwjoY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IyJGfOi99TBKwjoY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IyJGfOi99TBKwjoY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IyJGfOi99TBKwjoY .cluster text{fill:#333;}#mermaid-svg-IyJGfOi99TBKwjoY .cluster span{color:#333;}#mermaid-svg-IyJGfOi99TBKwjoY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IyJGfOi99TBKwjoY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IyJGfOi99TBKwjoY rect.text{fill:none;stroke-width:0;}#mermaid-svg-IyJGfOi99TBKwjoY .icon-shape,#mermaid-svg-IyJGfOi99TBKwjoY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IyJGfOi99TBKwjoY .icon-shape p,#mermaid-svg-IyJGfOi99TBKwjoY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IyJGfOi99TBKwjoY .icon-shape .label rect,#mermaid-svg-IyJGfOi99TBKwjoY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IyJGfOi99TBKwjoY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IyJGfOi99TBKwjoY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IyJGfOi99TBKwjoY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2
4
5
7
9
10
11

  • 7 的左子节点 4 < 7,右子节点 10 > 7。
  • 4 的左子节点 2 < 4,右子节点 5 > 4。
  • 10 的左子节点 9 < 10,右子节点 11 > 10。

这是一棵标准的二叉查找树。

2 ) 添加节点过程

向二叉查找树中添加节点时,遵循小的存左边,大的存右边,相等的值不存 的规则。

具体过程如下:

  1. 如果树为空,直接将新节点作为根节点。
  2. 如果树不为空,从根节点开始比较:
    • 若新节点的值 < 当前节点的值,且当前节点的左子节点为空,则成为左子节点;否则进入左子树继续比较。
    • 若新节点的值 > 当前节点的值,且当前节点的右子节点为空,则成为右子节点;否则进入右子树继续比较。
    • 若新节点的值 == 当前节点的值,不存储(或根据具体需求处理)。

添加实例:依次添加 7、4、10、5。

  1. 添加 7:树空,7 成为根节点。
  2. 添加 4:4 < 7,且 7 的左子节点为空,所以 4 成为 7 的左子节点。
  3. 添加 10:10 > 7,且 7 的右子节点为空,所以 10 成为 7 的右子节点。
  4. 添加 5:5 < 7,向左走;5 > 4,且 4 的右子节点为空,所以 5 成为 4 的右子节点。

结果:
#mermaid-svg-vuIebtorFFIUO02O{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vuIebtorFFIUO02O .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vuIebtorFFIUO02O .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vuIebtorFFIUO02O .error-icon{fill:#552222;}#mermaid-svg-vuIebtorFFIUO02O .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vuIebtorFFIUO02O .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vuIebtorFFIUO02O .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vuIebtorFFIUO02O .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vuIebtorFFIUO02O .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vuIebtorFFIUO02O .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vuIebtorFFIUO02O .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vuIebtorFFIUO02O .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vuIebtorFFIUO02O .marker.cross{stroke:#333333;}#mermaid-svg-vuIebtorFFIUO02O svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vuIebtorFFIUO02O p{margin:0;}#mermaid-svg-vuIebtorFFIUO02O .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vuIebtorFFIUO02O .cluster-label text{fill:#333;}#mermaid-svg-vuIebtorFFIUO02O .cluster-label span{color:#333;}#mermaid-svg-vuIebtorFFIUO02O .cluster-label span p{background-color:transparent;}#mermaid-svg-vuIebtorFFIUO02O .label text,#mermaid-svg-vuIebtorFFIUO02O span{fill:#333;color:#333;}#mermaid-svg-vuIebtorFFIUO02O .node rect,#mermaid-svg-vuIebtorFFIUO02O .node circle,#mermaid-svg-vuIebtorFFIUO02O .node ellipse,#mermaid-svg-vuIebtorFFIUO02O .node polygon,#mermaid-svg-vuIebtorFFIUO02O .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vuIebtorFFIUO02O .rough-node .label text,#mermaid-svg-vuIebtorFFIUO02O .node .label text,#mermaid-svg-vuIebtorFFIUO02O .image-shape .label,#mermaid-svg-vuIebtorFFIUO02O .icon-shape .label{text-anchor:middle;}#mermaid-svg-vuIebtorFFIUO02O .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vuIebtorFFIUO02O .rough-node .label,#mermaid-svg-vuIebtorFFIUO02O .node .label,#mermaid-svg-vuIebtorFFIUO02O .image-shape .label,#mermaid-svg-vuIebtorFFIUO02O .icon-shape .label{text-align:center;}#mermaid-svg-vuIebtorFFIUO02O .node.clickable{cursor:pointer;}#mermaid-svg-vuIebtorFFIUO02O .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vuIebtorFFIUO02O .arrowheadPath{fill:#333333;}#mermaid-svg-vuIebtorFFIUO02O .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vuIebtorFFIUO02O .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vuIebtorFFIUO02O .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vuIebtorFFIUO02O .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vuIebtorFFIUO02O .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vuIebtorFFIUO02O .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vuIebtorFFIUO02O .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vuIebtorFFIUO02O .cluster text{fill:#333;}#mermaid-svg-vuIebtorFFIUO02O .cluster span{color:#333;}#mermaid-svg-vuIebtorFFIUO02O div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vuIebtorFFIUO02O .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vuIebtorFFIUO02O rect.text{fill:none;stroke-width:0;}#mermaid-svg-vuIebtorFFIUO02O .icon-shape,#mermaid-svg-vuIebtorFFIUO02O .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vuIebtorFFIUO02O .icon-shape p,#mermaid-svg-vuIebtorFFIUO02O .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vuIebtorFFIUO02O .icon-shape .label rect,#mermaid-svg-vuIebtorFFIUO02O .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vuIebtorFFIUO02O .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vuIebtorFFIUO02O .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vuIebtorFFIUO02O :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 4
5
7
10

如果继续添加 12、13,会出现"一边倒"的情况,这在后面会引出平衡二叉树的需求。

3 ) 代码演示:节点类与插入

下面使用 Java 代码演示二叉查找树的节点结构和插入过程。

节点类(包含父节点引用,以备平衡树使用):

java 复制代码
class TreeNode {
    int value;
    TreeNode parent;
    TreeNode left;
    TreeNode right;
 
    public TreeNode(int value) {
        this.value = value;
    }
 
    // 插入节点(二叉查找树规则)
    public void insert(int newValue) {
        if (newValue < this.value) {
            if (left == null) {
                left = new TreeNode(newValue);
                left.parent = this;
            } else {
                left.insert(newValue);
            }
        } else if (newValue > this.value) {
            if (right == null) {
                right = new TreeNode(newValue);
                right.parent = this;
            } else {
                right.insert(newValue);
            }
        }
        // 相等则不处理 
    }
}

构建树并输出结构:

java 复制代码
public class BSTDemo {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(7);
        root.insert(4);
        root.insert(10);
        root.insert(5);
        // 输出树的结构(先序)
        printTree(root, "");
    }
 
    public static void printTree(TreeNode node, String prefix) {
        if (node == null) return;
        System.out.println(prefix + "├─ " + node.value);
        if (node.left != null || node.right != null) {
            if (node.left != null) {
                printTree(node.left, prefix + "│   ");
            } else {
                System.out.println(prefix + "│   ├─ null");
            }
            if (node.right != null) {
                printTree(node.right, prefix + "    ");
            } else {
                System.out.println(prefix + "    ├─ null");
            }
        }
    }
}

输出示例:

tree 复制代码
├─ 7 
│   ├─ 4 
│   │   ├─ null 
│   │   ├─ 5 
│   │       ├─ null 
│   │       ├─ null 
│   ├─ 10 
│       ├─ null 
│       ├─ null 

平衡二叉树

1 ) 为什么需要平衡

二叉查找树的插入顺序会影响树的形状。例如按 7、10、11、12、13 的顺序依次插入:
#mermaid-svg-PShpJYJCqvRCjJZw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PShpJYJCqvRCjJZw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PShpJYJCqvRCjJZw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PShpJYJCqvRCjJZw .error-icon{fill:#552222;}#mermaid-svg-PShpJYJCqvRCjJZw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PShpJYJCqvRCjJZw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PShpJYJCqvRCjJZw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PShpJYJCqvRCjJZw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PShpJYJCqvRCjJZw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PShpJYJCqvRCjJZw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PShpJYJCqvRCjJZw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PShpJYJCqvRCjJZw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PShpJYJCqvRCjJZw .marker.cross{stroke:#333333;}#mermaid-svg-PShpJYJCqvRCjJZw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PShpJYJCqvRCjJZw p{margin:0;}#mermaid-svg-PShpJYJCqvRCjJZw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PShpJYJCqvRCjJZw .cluster-label text{fill:#333;}#mermaid-svg-PShpJYJCqvRCjJZw .cluster-label span{color:#333;}#mermaid-svg-PShpJYJCqvRCjJZw .cluster-label span p{background-color:transparent;}#mermaid-svg-PShpJYJCqvRCjJZw .label text,#mermaid-svg-PShpJYJCqvRCjJZw span{fill:#333;color:#333;}#mermaid-svg-PShpJYJCqvRCjJZw .node rect,#mermaid-svg-PShpJYJCqvRCjJZw .node circle,#mermaid-svg-PShpJYJCqvRCjJZw .node ellipse,#mermaid-svg-PShpJYJCqvRCjJZw .node polygon,#mermaid-svg-PShpJYJCqvRCjJZw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PShpJYJCqvRCjJZw .rough-node .label text,#mermaid-svg-PShpJYJCqvRCjJZw .node .label text,#mermaid-svg-PShpJYJCqvRCjJZw .image-shape .label,#mermaid-svg-PShpJYJCqvRCjJZw .icon-shape .label{text-anchor:middle;}#mermaid-svg-PShpJYJCqvRCjJZw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PShpJYJCqvRCjJZw .rough-node .label,#mermaid-svg-PShpJYJCqvRCjJZw .node .label,#mermaid-svg-PShpJYJCqvRCjJZw .image-shape .label,#mermaid-svg-PShpJYJCqvRCjJZw .icon-shape .label{text-align:center;}#mermaid-svg-PShpJYJCqvRCjJZw .node.clickable{cursor:pointer;}#mermaid-svg-PShpJYJCqvRCjJZw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PShpJYJCqvRCjJZw .arrowheadPath{fill:#333333;}#mermaid-svg-PShpJYJCqvRCjJZw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PShpJYJCqvRCjJZw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PShpJYJCqvRCjJZw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PShpJYJCqvRCjJZw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PShpJYJCqvRCjJZw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PShpJYJCqvRCjJZw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PShpJYJCqvRCjJZw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PShpJYJCqvRCjJZw .cluster text{fill:#333;}#mermaid-svg-PShpJYJCqvRCjJZw .cluster span{color:#333;}#mermaid-svg-PShpJYJCqvRCjJZw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PShpJYJCqvRCjJZw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PShpJYJCqvRCjJZw rect.text{fill:none;stroke-width:0;}#mermaid-svg-PShpJYJCqvRCjJZw .icon-shape,#mermaid-svg-PShpJYJCqvRCjJZw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PShpJYJCqvRCjJZw .icon-shape p,#mermaid-svg-PShpJYJCqvRCjJZw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PShpJYJCqvRCjJZw .icon-shape .label rect,#mermaid-svg-PShpJYJCqvRCjJZw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PShpJYJCqvRCjJZw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PShpJYJCqvRCjJZw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PShpJYJCqvRCjJZw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 7
10
11
12
13

整棵树退化成了一条链表。此时查找节点 13 需要比较 5 次,效率降低。树的高度差越大,查询效率就越接近 O(n)。为了避免这种情况,需要让树的左右子树高度尽可能接近,即平衡

2 ) 定义与判断

平衡二叉树(AVL 树是最典型的一种)的定义:

  1. 二叉树中,左右子树的高度差不超过 1
  2. 任意节点的左右子树也是平衡二叉树

判断示例:

二叉树 是否平衡 原因
文本描述:根节点 7,左子树高度 3,右子树高度 4,但节点 10 的左子树高度 0,右子树高度 3,差超过 1 节点 10 左右高度差为 3 − 0 = 3 > 1
文本描述:节点 4 左子树高度 2,右子树高度 0 节点 4 左右高度差 2 − 0 = 2 > 1
文本描述:根节点 7,左子树高度 2,右子树高度 1;其他节点高度差均 ≤ 1 所有节点高度差都 ≤ 1
文本描述:根节点 7 左右高度均 2;节点 4 左高度 1,右高度 0,差 1 所有节点高度差 ≤ 1

平衡二叉树的查询效率始终保持在 O(log n) 级别,因为树的高度被控制在对数级别。

平衡二叉树的旋转机制

当向平衡二叉树中添加一个节点后,可能导致树不再平衡。此时,需要通过左旋右旋操作来恢复平衡。

1 ) 左旋(Left Rotation)

触发条件:右子树过高(右侧节点偏多),需要将右侧节点向左旋转。

左旋步骤

  1. 将原先的右子节点(设为 R)提升为新的根节点。
  2. 原先的根节点(设为 E)降级为 R 的左子节点。
  3. R 原先的左子节点移交给 E,作为 E 的右子节点。

简单左旋图解

旋转前:
#mermaid-svg-ueHcr87jps9QqHNM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ueHcr87jps9QqHNM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ueHcr87jps9QqHNM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ueHcr87jps9QqHNM .error-icon{fill:#552222;}#mermaid-svg-ueHcr87jps9QqHNM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ueHcr87jps9QqHNM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ueHcr87jps9QqHNM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ueHcr87jps9QqHNM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ueHcr87jps9QqHNM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ueHcr87jps9QqHNM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ueHcr87jps9QqHNM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ueHcr87jps9QqHNM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ueHcr87jps9QqHNM .marker.cross{stroke:#333333;}#mermaid-svg-ueHcr87jps9QqHNM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ueHcr87jps9QqHNM p{margin:0;}#mermaid-svg-ueHcr87jps9QqHNM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ueHcr87jps9QqHNM .cluster-label text{fill:#333;}#mermaid-svg-ueHcr87jps9QqHNM .cluster-label span{color:#333;}#mermaid-svg-ueHcr87jps9QqHNM .cluster-label span p{background-color:transparent;}#mermaid-svg-ueHcr87jps9QqHNM .label text,#mermaid-svg-ueHcr87jps9QqHNM span{fill:#333;color:#333;}#mermaid-svg-ueHcr87jps9QqHNM .node rect,#mermaid-svg-ueHcr87jps9QqHNM .node circle,#mermaid-svg-ueHcr87jps9QqHNM .node ellipse,#mermaid-svg-ueHcr87jps9QqHNM .node polygon,#mermaid-svg-ueHcr87jps9QqHNM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ueHcr87jps9QqHNM .rough-node .label text,#mermaid-svg-ueHcr87jps9QqHNM .node .label text,#mermaid-svg-ueHcr87jps9QqHNM .image-shape .label,#mermaid-svg-ueHcr87jps9QqHNM .icon-shape .label{text-anchor:middle;}#mermaid-svg-ueHcr87jps9QqHNM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ueHcr87jps9QqHNM .rough-node .label,#mermaid-svg-ueHcr87jps9QqHNM .node .label,#mermaid-svg-ueHcr87jps9QqHNM .image-shape .label,#mermaid-svg-ueHcr87jps9QqHNM .icon-shape .label{text-align:center;}#mermaid-svg-ueHcr87jps9QqHNM .node.clickable{cursor:pointer;}#mermaid-svg-ueHcr87jps9QqHNM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ueHcr87jps9QqHNM .arrowheadPath{fill:#333333;}#mermaid-svg-ueHcr87jps9QqHNM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ueHcr87jps9QqHNM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ueHcr87jps9QqHNM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ueHcr87jps9QqHNM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ueHcr87jps9QqHNM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ueHcr87jps9QqHNM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ueHcr87jps9QqHNM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ueHcr87jps9QqHNM .cluster text{fill:#333;}#mermaid-svg-ueHcr87jps9QqHNM .cluster span{color:#333;}#mermaid-svg-ueHcr87jps9QqHNM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ueHcr87jps9QqHNM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ueHcr87jps9QqHNM rect.text{fill:none;stroke-width:0;}#mermaid-svg-ueHcr87jps9QqHNM .icon-shape,#mermaid-svg-ueHcr87jps9QqHNM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ueHcr87jps9QqHNM .icon-shape p,#mermaid-svg-ueHcr87jps9QqHNM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ueHcr87jps9QqHNM .icon-shape .label rect,#mermaid-svg-ueHcr87jps9QqHNM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ueHcr87jps9QqHNM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ueHcr87jps9QqHNM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ueHcr87jps9QqHNM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} E 根
左子节点
R
RL
RR

旋转后:
#mermaid-svg-mLnhfV7cW2xL0aJm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mLnhfV7cW2xL0aJm .error-icon{fill:#552222;}#mermaid-svg-mLnhfV7cW2xL0aJm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mLnhfV7cW2xL0aJm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mLnhfV7cW2xL0aJm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mLnhfV7cW2xL0aJm .marker.cross{stroke:#333333;}#mermaid-svg-mLnhfV7cW2xL0aJm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mLnhfV7cW2xL0aJm p{margin:0;}#mermaid-svg-mLnhfV7cW2xL0aJm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mLnhfV7cW2xL0aJm .cluster-label text{fill:#333;}#mermaid-svg-mLnhfV7cW2xL0aJm .cluster-label span{color:#333;}#mermaid-svg-mLnhfV7cW2xL0aJm .cluster-label span p{background-color:transparent;}#mermaid-svg-mLnhfV7cW2xL0aJm .label text,#mermaid-svg-mLnhfV7cW2xL0aJm span{fill:#333;color:#333;}#mermaid-svg-mLnhfV7cW2xL0aJm .node rect,#mermaid-svg-mLnhfV7cW2xL0aJm .node circle,#mermaid-svg-mLnhfV7cW2xL0aJm .node ellipse,#mermaid-svg-mLnhfV7cW2xL0aJm .node polygon,#mermaid-svg-mLnhfV7cW2xL0aJm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mLnhfV7cW2xL0aJm .rough-node .label text,#mermaid-svg-mLnhfV7cW2xL0aJm .node .label text,#mermaid-svg-mLnhfV7cW2xL0aJm .image-shape .label,#mermaid-svg-mLnhfV7cW2xL0aJm .icon-shape .label{text-anchor:middle;}#mermaid-svg-mLnhfV7cW2xL0aJm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mLnhfV7cW2xL0aJm .rough-node .label,#mermaid-svg-mLnhfV7cW2xL0aJm .node .label,#mermaid-svg-mLnhfV7cW2xL0aJm .image-shape .label,#mermaid-svg-mLnhfV7cW2xL0aJm .icon-shape .label{text-align:center;}#mermaid-svg-mLnhfV7cW2xL0aJm .node.clickable{cursor:pointer;}#mermaid-svg-mLnhfV7cW2xL0aJm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mLnhfV7cW2xL0aJm .arrowheadPath{fill:#333333;}#mermaid-svg-mLnhfV7cW2xL0aJm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mLnhfV7cW2xL0aJm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mLnhfV7cW2xL0aJm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mLnhfV7cW2xL0aJm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mLnhfV7cW2xL0aJm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mLnhfV7cW2xL0aJm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mLnhfV7cW2xL0aJm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mLnhfV7cW2xL0aJm .cluster text{fill:#333;}#mermaid-svg-mLnhfV7cW2xL0aJm .cluster span{color:#333;}#mermaid-svg-mLnhfV7cW2xL0aJm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mLnhfV7cW2xL0aJm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mLnhfV7cW2xL0aJm rect.text{fill:none;stroke-width:0;}#mermaid-svg-mLnhfV7cW2xL0aJm .icon-shape,#mermaid-svg-mLnhfV7cW2xL0aJm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mLnhfV7cW2xL0aJm .icon-shape p,#mermaid-svg-mLnhfV7cW2xL0aJm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mLnhfV7cW2xL0aJm .icon-shape .label rect,#mermaid-svg-mLnhfV7cW2xL0aJm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mLnhfV7cW2xL0aJm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mLnhfV7cW2xL0aJm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mLnhfV7cW2xL0aJm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} R 新根
E 左子节点
RR 右子节点
原左子节点
RL 原 R 的左子节点

复杂左旋图解(R 节点有一个左子节点):

旋转前:
#mermaid-svg-gpD4yqQKExhA2yDM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gpD4yqQKExhA2yDM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gpD4yqQKExhA2yDM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gpD4yqQKExhA2yDM .error-icon{fill:#552222;}#mermaid-svg-gpD4yqQKExhA2yDM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gpD4yqQKExhA2yDM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gpD4yqQKExhA2yDM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gpD4yqQKExhA2yDM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gpD4yqQKExhA2yDM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gpD4yqQKExhA2yDM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gpD4yqQKExhA2yDM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gpD4yqQKExhA2yDM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gpD4yqQKExhA2yDM .marker.cross{stroke:#333333;}#mermaid-svg-gpD4yqQKExhA2yDM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gpD4yqQKExhA2yDM p{margin:0;}#mermaid-svg-gpD4yqQKExhA2yDM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gpD4yqQKExhA2yDM .cluster-label text{fill:#333;}#mermaid-svg-gpD4yqQKExhA2yDM .cluster-label span{color:#333;}#mermaid-svg-gpD4yqQKExhA2yDM .cluster-label span p{background-color:transparent;}#mermaid-svg-gpD4yqQKExhA2yDM .label text,#mermaid-svg-gpD4yqQKExhA2yDM span{fill:#333;color:#333;}#mermaid-svg-gpD4yqQKExhA2yDM .node rect,#mermaid-svg-gpD4yqQKExhA2yDM .node circle,#mermaid-svg-gpD4yqQKExhA2yDM .node ellipse,#mermaid-svg-gpD4yqQKExhA2yDM .node polygon,#mermaid-svg-gpD4yqQKExhA2yDM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gpD4yqQKExhA2yDM .rough-node .label text,#mermaid-svg-gpD4yqQKExhA2yDM .node .label text,#mermaid-svg-gpD4yqQKExhA2yDM .image-shape .label,#mermaid-svg-gpD4yqQKExhA2yDM .icon-shape .label{text-anchor:middle;}#mermaid-svg-gpD4yqQKExhA2yDM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gpD4yqQKExhA2yDM .rough-node .label,#mermaid-svg-gpD4yqQKExhA2yDM .node .label,#mermaid-svg-gpD4yqQKExhA2yDM .image-shape .label,#mermaid-svg-gpD4yqQKExhA2yDM .icon-shape .label{text-align:center;}#mermaid-svg-gpD4yqQKExhA2yDM .node.clickable{cursor:pointer;}#mermaid-svg-gpD4yqQKExhA2yDM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gpD4yqQKExhA2yDM .arrowheadPath{fill:#333333;}#mermaid-svg-gpD4yqQKExhA2yDM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gpD4yqQKExhA2yDM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gpD4yqQKExhA2yDM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gpD4yqQKExhA2yDM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gpD4yqQKExhA2yDM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gpD4yqQKExhA2yDM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gpD4yqQKExhA2yDM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gpD4yqQKExhA2yDM .cluster text{fill:#333;}#mermaid-svg-gpD4yqQKExhA2yDM .cluster span{color:#333;}#mermaid-svg-gpD4yqQKExhA2yDM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gpD4yqQKExhA2yDM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gpD4yqQKExhA2yDM rect.text{fill:none;stroke-width:0;}#mermaid-svg-gpD4yqQKExhA2yDM .icon-shape,#mermaid-svg-gpD4yqQKExhA2yDM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gpD4yqQKExhA2yDM .icon-shape p,#mermaid-svg-gpD4yqQKExhA2yDM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gpD4yqQKExhA2yDM .icon-shape .label rect,#mermaid-svg-gpD4yqQKExhA2yDM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gpD4yqQKExhA2yDM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gpD4yqQKExhA2yDM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gpD4yqQKExhA2yDM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 4
7
9
10
11
12

  • 添加节点 12 后,右子树过高,触发左旋。
  • 先忽略 9(10 的左子节点),将 10 提升为新根,7 降级为 10 的左子节点。
  • 处理 9:原来 9 是 10 的左子节点,旋转后无法再作为 10 的左子节点(因为 7 已经是左子节点了),因此将 9 移交给降级后的 7,作为 7 的右子节点。

旋转后:
#mermaid-svg-9qrGFk8dIRo8PsGl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9qrGFk8dIRo8PsGl .error-icon{fill:#552222;}#mermaid-svg-9qrGFk8dIRo8PsGl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9qrGFk8dIRo8PsGl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9qrGFk8dIRo8PsGl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9qrGFk8dIRo8PsGl .marker.cross{stroke:#333333;}#mermaid-svg-9qrGFk8dIRo8PsGl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9qrGFk8dIRo8PsGl p{margin:0;}#mermaid-svg-9qrGFk8dIRo8PsGl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9qrGFk8dIRo8PsGl .cluster-label text{fill:#333;}#mermaid-svg-9qrGFk8dIRo8PsGl .cluster-label span{color:#333;}#mermaid-svg-9qrGFk8dIRo8PsGl .cluster-label span p{background-color:transparent;}#mermaid-svg-9qrGFk8dIRo8PsGl .label text,#mermaid-svg-9qrGFk8dIRo8PsGl span{fill:#333;color:#333;}#mermaid-svg-9qrGFk8dIRo8PsGl .node rect,#mermaid-svg-9qrGFk8dIRo8PsGl .node circle,#mermaid-svg-9qrGFk8dIRo8PsGl .node ellipse,#mermaid-svg-9qrGFk8dIRo8PsGl .node polygon,#mermaid-svg-9qrGFk8dIRo8PsGl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9qrGFk8dIRo8PsGl .rough-node .label text,#mermaid-svg-9qrGFk8dIRo8PsGl .node .label text,#mermaid-svg-9qrGFk8dIRo8PsGl .image-shape .label,#mermaid-svg-9qrGFk8dIRo8PsGl .icon-shape .label{text-anchor:middle;}#mermaid-svg-9qrGFk8dIRo8PsGl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9qrGFk8dIRo8PsGl .rough-node .label,#mermaid-svg-9qrGFk8dIRo8PsGl .node .label,#mermaid-svg-9qrGFk8dIRo8PsGl .image-shape .label,#mermaid-svg-9qrGFk8dIRo8PsGl .icon-shape .label{text-align:center;}#mermaid-svg-9qrGFk8dIRo8PsGl .node.clickable{cursor:pointer;}#mermaid-svg-9qrGFk8dIRo8PsGl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9qrGFk8dIRo8PsGl .arrowheadPath{fill:#333333;}#mermaid-svg-9qrGFk8dIRo8PsGl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9qrGFk8dIRo8PsGl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9qrGFk8dIRo8PsGl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9qrGFk8dIRo8PsGl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9qrGFk8dIRo8PsGl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9qrGFk8dIRo8PsGl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9qrGFk8dIRo8PsGl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9qrGFk8dIRo8PsGl .cluster text{fill:#333;}#mermaid-svg-9qrGFk8dIRo8PsGl .cluster span{color:#333;}#mermaid-svg-9qrGFk8dIRo8PsGl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9qrGFk8dIRo8PsGl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9qrGFk8dIRo8PsGl rect.text{fill:none;stroke-width:0;}#mermaid-svg-9qrGFk8dIRo8PsGl .icon-shape,#mermaid-svg-9qrGFk8dIRo8PsGl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9qrGFk8dIRo8PsGl .icon-shape p,#mermaid-svg-9qrGFk8dIRo8PsGl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9qrGFk8dIRo8PsGl .icon-shape .label rect,#mermaid-svg-9qrGFk8dIRo8PsGl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9qrGFk8dIRo8PsGl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9qrGFk8dIRo8PsGl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9qrGFk8dIRo8PsGl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 4
7
9
10
11
12

Java 代码演示左旋(假设节点包含父指针):

java 复制代码
// 左旋操作,以当前节点为根进行左旋 
public TreeNode rotateLeft() {
    TreeNode newRoot = this.right;  // 新根是当前的右子节点 
    if (newRoot == null) return this;
 
    // 当前节点成为新根的左子节点 
    this.right = newRoot.left;
    if (newRoot.left != null) {
        newRoot.left.parent = this;
    }
 
    // 新根替换当前节点的位置 
    newRoot.parent = this.parent;
    if (this.parent != null) {
        if (this.parent.left == this) {
            this.parent.left = newRoot;
        } else {
            this.parent.right = newRoot;
        }
    }
 
    // 设置当前节点为新根的左子节点 
    newRoot.left = this;
    this.parent = newRoot;
 
    return newRoot; // 返回新的根节点 
}

2 ) 右旋(Right Rotation)

触发条件:左子树过高,需要将左侧节点向右旋转。

右旋步骤:

  1. 将原先的左子节点(设为 L)提升为新的根节点。
  2. 原先的根节点(设为 E)降级为 L 的右子节点。
  3. L 原先的右子节点移交给 E,作为 E 的左子节点。

简单右旋图解

旋转前:
#mermaid-svg-AVCj55A2CxtVAZBa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AVCj55A2CxtVAZBa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AVCj55A2CxtVAZBa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AVCj55A2CxtVAZBa .error-icon{fill:#552222;}#mermaid-svg-AVCj55A2CxtVAZBa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AVCj55A2CxtVAZBa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AVCj55A2CxtVAZBa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AVCj55A2CxtVAZBa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AVCj55A2CxtVAZBa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AVCj55A2CxtVAZBa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AVCj55A2CxtVAZBa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AVCj55A2CxtVAZBa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AVCj55A2CxtVAZBa .marker.cross{stroke:#333333;}#mermaid-svg-AVCj55A2CxtVAZBa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AVCj55A2CxtVAZBa p{margin:0;}#mermaid-svg-AVCj55A2CxtVAZBa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AVCj55A2CxtVAZBa .cluster-label text{fill:#333;}#mermaid-svg-AVCj55A2CxtVAZBa .cluster-label span{color:#333;}#mermaid-svg-AVCj55A2CxtVAZBa .cluster-label span p{background-color:transparent;}#mermaid-svg-AVCj55A2CxtVAZBa .label text,#mermaid-svg-AVCj55A2CxtVAZBa span{fill:#333;color:#333;}#mermaid-svg-AVCj55A2CxtVAZBa .node rect,#mermaid-svg-AVCj55A2CxtVAZBa .node circle,#mermaid-svg-AVCj55A2CxtVAZBa .node ellipse,#mermaid-svg-AVCj55A2CxtVAZBa .node polygon,#mermaid-svg-AVCj55A2CxtVAZBa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AVCj55A2CxtVAZBa .rough-node .label text,#mermaid-svg-AVCj55A2CxtVAZBa .node .label text,#mermaid-svg-AVCj55A2CxtVAZBa .image-shape .label,#mermaid-svg-AVCj55A2CxtVAZBa .icon-shape .label{text-anchor:middle;}#mermaid-svg-AVCj55A2CxtVAZBa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AVCj55A2CxtVAZBa .rough-node .label,#mermaid-svg-AVCj55A2CxtVAZBa .node .label,#mermaid-svg-AVCj55A2CxtVAZBa .image-shape .label,#mermaid-svg-AVCj55A2CxtVAZBa .icon-shape .label{text-align:center;}#mermaid-svg-AVCj55A2CxtVAZBa .node.clickable{cursor:pointer;}#mermaid-svg-AVCj55A2CxtVAZBa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AVCj55A2CxtVAZBa .arrowheadPath{fill:#333333;}#mermaid-svg-AVCj55A2CxtVAZBa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AVCj55A2CxtVAZBa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AVCj55A2CxtVAZBa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AVCj55A2CxtVAZBa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AVCj55A2CxtVAZBa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AVCj55A2CxtVAZBa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AVCj55A2CxtVAZBa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AVCj55A2CxtVAZBa .cluster text{fill:#333;}#mermaid-svg-AVCj55A2CxtVAZBa .cluster span{color:#333;}#mermaid-svg-AVCj55A2CxtVAZBa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AVCj55A2CxtVAZBa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AVCj55A2CxtVAZBa rect.text{fill:none;stroke-width:0;}#mermaid-svg-AVCj55A2CxtVAZBa .icon-shape,#mermaid-svg-AVCj55A2CxtVAZBa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AVCj55A2CxtVAZBa .icon-shape p,#mermaid-svg-AVCj55A2CxtVAZBa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AVCj55A2CxtVAZBa .icon-shape .label rect,#mermaid-svg-AVCj55A2CxtVAZBa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AVCj55A2CxtVAZBa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AVCj55A2CxtVAZBa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AVCj55A2CxtVAZBa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} E 根
L
右子节点
LL
LR

旋转后:
#mermaid-svg-ASbqGF4DhA3Q3qgz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ASbqGF4DhA3Q3qgz .error-icon{fill:#552222;}#mermaid-svg-ASbqGF4DhA3Q3qgz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ASbqGF4DhA3Q3qgz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .marker.cross{stroke:#333333;}#mermaid-svg-ASbqGF4DhA3Q3qgz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ASbqGF4DhA3Q3qgz p{margin:0;}#mermaid-svg-ASbqGF4DhA3Q3qgz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .cluster-label text{fill:#333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .cluster-label span{color:#333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .cluster-label span p{background-color:transparent;}#mermaid-svg-ASbqGF4DhA3Q3qgz .label text,#mermaid-svg-ASbqGF4DhA3Q3qgz span{fill:#333;color:#333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .node rect,#mermaid-svg-ASbqGF4DhA3Q3qgz .node circle,#mermaid-svg-ASbqGF4DhA3Q3qgz .node ellipse,#mermaid-svg-ASbqGF4DhA3Q3qgz .node polygon,#mermaid-svg-ASbqGF4DhA3Q3qgz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ASbqGF4DhA3Q3qgz .rough-node .label text,#mermaid-svg-ASbqGF4DhA3Q3qgz .node .label text,#mermaid-svg-ASbqGF4DhA3Q3qgz .image-shape .label,#mermaid-svg-ASbqGF4DhA3Q3qgz .icon-shape .label{text-anchor:middle;}#mermaid-svg-ASbqGF4DhA3Q3qgz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ASbqGF4DhA3Q3qgz .rough-node .label,#mermaid-svg-ASbqGF4DhA3Q3qgz .node .label,#mermaid-svg-ASbqGF4DhA3Q3qgz .image-shape .label,#mermaid-svg-ASbqGF4DhA3Q3qgz .icon-shape .label{text-align:center;}#mermaid-svg-ASbqGF4DhA3Q3qgz .node.clickable{cursor:pointer;}#mermaid-svg-ASbqGF4DhA3Q3qgz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .arrowheadPath{fill:#333333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ASbqGF4DhA3Q3qgz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ASbqGF4DhA3Q3qgz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ASbqGF4DhA3Q3qgz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ASbqGF4DhA3Q3qgz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ASbqGF4DhA3Q3qgz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ASbqGF4DhA3Q3qgz .cluster text{fill:#333;}#mermaid-svg-ASbqGF4DhA3Q3qgz .cluster span{color:#333;}#mermaid-svg-ASbqGF4DhA3Q3qgz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ASbqGF4DhA3Q3qgz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ASbqGF4DhA3Q3qgz rect.text{fill:none;stroke-width:0;}#mermaid-svg-ASbqGF4DhA3Q3qgz .icon-shape,#mermaid-svg-ASbqGF4DhA3Q3qgz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ASbqGF4DhA3Q3qgz .icon-shape p,#mermaid-svg-ASbqGF4DhA3Q3qgz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ASbqGF4DhA3Q3qgz .icon-shape .label rect,#mermaid-svg-ASbqGF4DhA3Q3qgz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ASbqGF4DhA3Q3qgz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ASbqGF4DhA3Q3qgz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ASbqGF4DhA3Q3qgz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} L 新根
LL
E 右子节点
LR
右子节点

复杂右旋图解(L 节点有一个右子节点 5):

旋转前:
#mermaid-svg-8dns1QTFTnMkAtdu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8dns1QTFTnMkAtdu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8dns1QTFTnMkAtdu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8dns1QTFTnMkAtdu .error-icon{fill:#552222;}#mermaid-svg-8dns1QTFTnMkAtdu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8dns1QTFTnMkAtdu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8dns1QTFTnMkAtdu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8dns1QTFTnMkAtdu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8dns1QTFTnMkAtdu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8dns1QTFTnMkAtdu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8dns1QTFTnMkAtdu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8dns1QTFTnMkAtdu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8dns1QTFTnMkAtdu .marker.cross{stroke:#333333;}#mermaid-svg-8dns1QTFTnMkAtdu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8dns1QTFTnMkAtdu p{margin:0;}#mermaid-svg-8dns1QTFTnMkAtdu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8dns1QTFTnMkAtdu .cluster-label text{fill:#333;}#mermaid-svg-8dns1QTFTnMkAtdu .cluster-label span{color:#333;}#mermaid-svg-8dns1QTFTnMkAtdu .cluster-label span p{background-color:transparent;}#mermaid-svg-8dns1QTFTnMkAtdu .label text,#mermaid-svg-8dns1QTFTnMkAtdu span{fill:#333;color:#333;}#mermaid-svg-8dns1QTFTnMkAtdu .node rect,#mermaid-svg-8dns1QTFTnMkAtdu .node circle,#mermaid-svg-8dns1QTFTnMkAtdu .node ellipse,#mermaid-svg-8dns1QTFTnMkAtdu .node polygon,#mermaid-svg-8dns1QTFTnMkAtdu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8dns1QTFTnMkAtdu .rough-node .label text,#mermaid-svg-8dns1QTFTnMkAtdu .node .label text,#mermaid-svg-8dns1QTFTnMkAtdu .image-shape .label,#mermaid-svg-8dns1QTFTnMkAtdu .icon-shape .label{text-anchor:middle;}#mermaid-svg-8dns1QTFTnMkAtdu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8dns1QTFTnMkAtdu .rough-node .label,#mermaid-svg-8dns1QTFTnMkAtdu .node .label,#mermaid-svg-8dns1QTFTnMkAtdu .image-shape .label,#mermaid-svg-8dns1QTFTnMkAtdu .icon-shape .label{text-align:center;}#mermaid-svg-8dns1QTFTnMkAtdu .node.clickable{cursor:pointer;}#mermaid-svg-8dns1QTFTnMkAtdu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8dns1QTFTnMkAtdu .arrowheadPath{fill:#333333;}#mermaid-svg-8dns1QTFTnMkAtdu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8dns1QTFTnMkAtdu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8dns1QTFTnMkAtdu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8dns1QTFTnMkAtdu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8dns1QTFTnMkAtdu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8dns1QTFTnMkAtdu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8dns1QTFTnMkAtdu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8dns1QTFTnMkAtdu .cluster text{fill:#333;}#mermaid-svg-8dns1QTFTnMkAtdu .cluster span{color:#333;}#mermaid-svg-8dns1QTFTnMkAtdu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8dns1QTFTnMkAtdu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8dns1QTFTnMkAtdu rect.text{fill:none;stroke-width:0;}#mermaid-svg-8dns1QTFTnMkAtdu .icon-shape,#mermaid-svg-8dns1QTFTnMkAtdu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8dns1QTFTnMkAtdu .icon-shape p,#mermaid-svg-8dns1QTFTnMkAtdu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8dns1QTFTnMkAtdu .icon-shape .label rect,#mermaid-svg-8dns1QTFTnMkAtdu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8dns1QTFTnMkAtdu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8dns1QTFTnMkAtdu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8dns1QTFTnMkAtdu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1
2
4
5
7
10

  • 添加节点 1 后,左子树过高,触发右旋。
  • 先忽略 5(4 的右子节点),将 4 提升为新根,7 降级为 4 的右子节点。
  • 处理 5:原来 5 是 4 的右子节点,旋转后交给降级后的 7,作为 7 的左子节点。

旋转后:
#mermaid-svg-Fs4xRqY4n1kG3Qln{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Fs4xRqY4n1kG3Qln .error-icon{fill:#552222;}#mermaid-svg-Fs4xRqY4n1kG3Qln .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Fs4xRqY4n1kG3Qln .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .marker.cross{stroke:#333333;}#mermaid-svg-Fs4xRqY4n1kG3Qln svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Fs4xRqY4n1kG3Qln p{margin:0;}#mermaid-svg-Fs4xRqY4n1kG3Qln .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .cluster-label text{fill:#333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .cluster-label span{color:#333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .cluster-label span p{background-color:transparent;}#mermaid-svg-Fs4xRqY4n1kG3Qln .label text,#mermaid-svg-Fs4xRqY4n1kG3Qln span{fill:#333;color:#333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .node rect,#mermaid-svg-Fs4xRqY4n1kG3Qln .node circle,#mermaid-svg-Fs4xRqY4n1kG3Qln .node ellipse,#mermaid-svg-Fs4xRqY4n1kG3Qln .node polygon,#mermaid-svg-Fs4xRqY4n1kG3Qln .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Fs4xRqY4n1kG3Qln .rough-node .label text,#mermaid-svg-Fs4xRqY4n1kG3Qln .node .label text,#mermaid-svg-Fs4xRqY4n1kG3Qln .image-shape .label,#mermaid-svg-Fs4xRqY4n1kG3Qln .icon-shape .label{text-anchor:middle;}#mermaid-svg-Fs4xRqY4n1kG3Qln .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Fs4xRqY4n1kG3Qln .rough-node .label,#mermaid-svg-Fs4xRqY4n1kG3Qln .node .label,#mermaid-svg-Fs4xRqY4n1kG3Qln .image-shape .label,#mermaid-svg-Fs4xRqY4n1kG3Qln .icon-shape .label{text-align:center;}#mermaid-svg-Fs4xRqY4n1kG3Qln .node.clickable{cursor:pointer;}#mermaid-svg-Fs4xRqY4n1kG3Qln .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .arrowheadPath{fill:#333333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Fs4xRqY4n1kG3Qln .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Fs4xRqY4n1kG3Qln .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Fs4xRqY4n1kG3Qln .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Fs4xRqY4n1kG3Qln .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Fs4xRqY4n1kG3Qln .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Fs4xRqY4n1kG3Qln .cluster text{fill:#333;}#mermaid-svg-Fs4xRqY4n1kG3Qln .cluster span{color:#333;}#mermaid-svg-Fs4xRqY4n1kG3Qln div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Fs4xRqY4n1kG3Qln .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Fs4xRqY4n1kG3Qln rect.text{fill:none;stroke-width:0;}#mermaid-svg-Fs4xRqY4n1kG3Qln .icon-shape,#mermaid-svg-Fs4xRqY4n1kG3Qln .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Fs4xRqY4n1kG3Qln .icon-shape p,#mermaid-svg-Fs4xRqY4n1kG3Qln .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Fs4xRqY4n1kG3Qln .icon-shape .label rect,#mermaid-svg-Fs4xRqY4n1kG3Qln .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Fs4xRqY4n1kG3Qln .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Fs4xRqY4n1kG3Qln .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Fs4xRqY4n1kG3Qln :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1
2
4
5
7
10

Java 代码演示右旋

java 复制代码
// 右旋操作,以当前节点为根进行右旋 
public TreeNode rotateRight() {
    TreeNode newRoot = this.left;   // 新根是当前的左子节点 
    if (newRoot == null) return this;
 
    // 当前节点成为新根的右子节点 
    this.left = newRoot.right;
    if (newRoot.right != null) {
        newRoot.right.parent = this;
    }
 
    // 新根替换当前节点的位置 
    newRoot.parent = this.parent;
    if (this.parent != null) {
        if (this.parent.left == this) {
            this.parent.left = newRoot;
        } else {
            this.parent.right = newRoot;
        }
    }
 
    // 设置当前节点为新根的右子节点 
    newRoot.right = this;
    this.parent = newRoot;
 
    return newRoot; // 返回新的根节点 
}

3 ) 左左、左右、右右、右左四种情况

当插入节点导致失衡时,根据插入位置的不同,分为四种情况,分别采用不同的旋转组合来恢复平衡。

情况 插入位置 失衡特征 恢复操作
左左 (LL) 根节点左子树的左子树 左子树高度 − 右子树高度 > 1,且左子节点的左子树高 一次右旋
左右 (LR) 根节点左子树的右子树 左子树高度 − 右子树高度 > 1,且左子节点的右子树高 先局部左旋,再整体右旋
右右 (RR) 根节点右子树的右子树 右子树高度 − 左子树高度 > 1,且右子节点的右子树高 一次左旋
右左 (RL) 根节点右子树的左子树 右子树高度 − 左子树高度 > 1,且右子节点的左子树高 先局部右旋,再整体左旋

左左 (LL) 示例:
#mermaid-svg-nQ4pgygyNOyxbxkh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nQ4pgygyNOyxbxkh .error-icon{fill:#552222;}#mermaid-svg-nQ4pgygyNOyxbxkh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nQ4pgygyNOyxbxkh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nQ4pgygyNOyxbxkh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nQ4pgygyNOyxbxkh .marker.cross{stroke:#333333;}#mermaid-svg-nQ4pgygyNOyxbxkh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nQ4pgygyNOyxbxkh p{margin:0;}#mermaid-svg-nQ4pgygyNOyxbxkh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nQ4pgygyNOyxbxkh .cluster-label text{fill:#333;}#mermaid-svg-nQ4pgygyNOyxbxkh .cluster-label span{color:#333;}#mermaid-svg-nQ4pgygyNOyxbxkh .cluster-label span p{background-color:transparent;}#mermaid-svg-nQ4pgygyNOyxbxkh .label text,#mermaid-svg-nQ4pgygyNOyxbxkh span{fill:#333;color:#333;}#mermaid-svg-nQ4pgygyNOyxbxkh .node rect,#mermaid-svg-nQ4pgygyNOyxbxkh .node circle,#mermaid-svg-nQ4pgygyNOyxbxkh .node ellipse,#mermaid-svg-nQ4pgygyNOyxbxkh .node polygon,#mermaid-svg-nQ4pgygyNOyxbxkh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nQ4pgygyNOyxbxkh .rough-node .label text,#mermaid-svg-nQ4pgygyNOyxbxkh .node .label text,#mermaid-svg-nQ4pgygyNOyxbxkh .image-shape .label,#mermaid-svg-nQ4pgygyNOyxbxkh .icon-shape .label{text-anchor:middle;}#mermaid-svg-nQ4pgygyNOyxbxkh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nQ4pgygyNOyxbxkh .rough-node .label,#mermaid-svg-nQ4pgygyNOyxbxkh .node .label,#mermaid-svg-nQ4pgygyNOyxbxkh .image-shape .label,#mermaid-svg-nQ4pgygyNOyxbxkh .icon-shape .label{text-align:center;}#mermaid-svg-nQ4pgygyNOyxbxkh .node.clickable{cursor:pointer;}#mermaid-svg-nQ4pgygyNOyxbxkh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nQ4pgygyNOyxbxkh .arrowheadPath{fill:#333333;}#mermaid-svg-nQ4pgygyNOyxbxkh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nQ4pgygyNOyxbxkh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nQ4pgygyNOyxbxkh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nQ4pgygyNOyxbxkh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nQ4pgygyNOyxbxkh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nQ4pgygyNOyxbxkh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nQ4pgygyNOyxbxkh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nQ4pgygyNOyxbxkh .cluster text{fill:#333;}#mermaid-svg-nQ4pgygyNOyxbxkh .cluster span{color:#333;}#mermaid-svg-nQ4pgygyNOyxbxkh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nQ4pgygyNOyxbxkh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nQ4pgygyNOyxbxkh rect.text{fill:none;stroke-width:0;}#mermaid-svg-nQ4pgygyNOyxbxkh .icon-shape,#mermaid-svg-nQ4pgygyNOyxbxkh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nQ4pgygyNOyxbxkh .icon-shape p,#mermaid-svg-nQ4pgygyNOyxbxkh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nQ4pgygyNOyxbxkh .icon-shape .label rect,#mermaid-svg-nQ4pgygyNOyxbxkh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nQ4pgygyNOyxbxkh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nQ4pgygyNOyxbxkh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nQ4pgygyNOyxbxkh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 一次右旋后平衡
4
2
7
1
5
10
插入后失衡
7
4
10
2
5
1
插入后失衡
一次右旋后平衡

左右 (LR) 示例(在左子树的右子树插入 6):

失衡树:
#mermaid-svg-dHngOYDzwstKWb6C{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dHngOYDzwstKWb6C .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dHngOYDzwstKWb6C .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dHngOYDzwstKWb6C .error-icon{fill:#552222;}#mermaid-svg-dHngOYDzwstKWb6C .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dHngOYDzwstKWb6C .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dHngOYDzwstKWb6C .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dHngOYDzwstKWb6C .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dHngOYDzwstKWb6C .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dHngOYDzwstKWb6C .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dHngOYDzwstKWb6C .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dHngOYDzwstKWb6C .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dHngOYDzwstKWb6C .marker.cross{stroke:#333333;}#mermaid-svg-dHngOYDzwstKWb6C svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dHngOYDzwstKWb6C p{margin:0;}#mermaid-svg-dHngOYDzwstKWb6C .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dHngOYDzwstKWb6C .cluster-label text{fill:#333;}#mermaid-svg-dHngOYDzwstKWb6C .cluster-label span{color:#333;}#mermaid-svg-dHngOYDzwstKWb6C .cluster-label span p{background-color:transparent;}#mermaid-svg-dHngOYDzwstKWb6C .label text,#mermaid-svg-dHngOYDzwstKWb6C span{fill:#333;color:#333;}#mermaid-svg-dHngOYDzwstKWb6C .node rect,#mermaid-svg-dHngOYDzwstKWb6C .node circle,#mermaid-svg-dHngOYDzwstKWb6C .node ellipse,#mermaid-svg-dHngOYDzwstKWb6C .node polygon,#mermaid-svg-dHngOYDzwstKWb6C .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dHngOYDzwstKWb6C .rough-node .label text,#mermaid-svg-dHngOYDzwstKWb6C .node .label text,#mermaid-svg-dHngOYDzwstKWb6C .image-shape .label,#mermaid-svg-dHngOYDzwstKWb6C .icon-shape .label{text-anchor:middle;}#mermaid-svg-dHngOYDzwstKWb6C .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dHngOYDzwstKWb6C .rough-node .label,#mermaid-svg-dHngOYDzwstKWb6C .node .label,#mermaid-svg-dHngOYDzwstKWb6C .image-shape .label,#mermaid-svg-dHngOYDzwstKWb6C .icon-shape .label{text-align:center;}#mermaid-svg-dHngOYDzwstKWb6C .node.clickable{cursor:pointer;}#mermaid-svg-dHngOYDzwstKWb6C .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dHngOYDzwstKWb6C .arrowheadPath{fill:#333333;}#mermaid-svg-dHngOYDzwstKWb6C .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dHngOYDzwstKWb6C .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dHngOYDzwstKWb6C .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dHngOYDzwstKWb6C .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dHngOYDzwstKWb6C .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dHngOYDzwstKWb6C .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dHngOYDzwstKWb6C .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dHngOYDzwstKWb6C .cluster text{fill:#333;}#mermaid-svg-dHngOYDzwstKWb6C .cluster span{color:#333;}#mermaid-svg-dHngOYDzwstKWb6C div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dHngOYDzwstKWb6C .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dHngOYDzwstKWb6C rect.text{fill:none;stroke-width:0;}#mermaid-svg-dHngOYDzwstKWb6C .icon-shape,#mermaid-svg-dHngOYDzwstKWb6C .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dHngOYDzwstKWb6C .icon-shape p,#mermaid-svg-dHngOYDzwstKWb6C .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dHngOYDzwstKWb6C .icon-shape .label rect,#mermaid-svg-dHngOYDzwstKWb6C .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dHngOYDzwstKWb6C .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dHngOYDzwstKWb6C .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dHngOYDzwstKWb6C :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2
4
5
6
7
10

  • 第一步:对 4 的右子树进行左旋(局部),5 上提,4 下移。
  • 第二步:得到类似"左左"的结构后,再对整棵树进行右旋。

旋转过程:
#mermaid-svg-SFLYneuR4H3Hjizm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SFLYneuR4H3Hjizm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SFLYneuR4H3Hjizm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SFLYneuR4H3Hjizm .error-icon{fill:#552222;}#mermaid-svg-SFLYneuR4H3Hjizm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SFLYneuR4H3Hjizm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SFLYneuR4H3Hjizm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SFLYneuR4H3Hjizm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SFLYneuR4H3Hjizm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SFLYneuR4H3Hjizm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SFLYneuR4H3Hjizm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SFLYneuR4H3Hjizm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SFLYneuR4H3Hjizm .marker.cross{stroke:#333333;}#mermaid-svg-SFLYneuR4H3Hjizm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SFLYneuR4H3Hjizm p{margin:0;}#mermaid-svg-SFLYneuR4H3Hjizm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SFLYneuR4H3Hjizm .cluster-label text{fill:#333;}#mermaid-svg-SFLYneuR4H3Hjizm .cluster-label span{color:#333;}#mermaid-svg-SFLYneuR4H3Hjizm .cluster-label span p{background-color:transparent;}#mermaid-svg-SFLYneuR4H3Hjizm .label text,#mermaid-svg-SFLYneuR4H3Hjizm span{fill:#333;color:#333;}#mermaid-svg-SFLYneuR4H3Hjizm .node rect,#mermaid-svg-SFLYneuR4H3Hjizm .node circle,#mermaid-svg-SFLYneuR4H3Hjizm .node ellipse,#mermaid-svg-SFLYneuR4H3Hjizm .node polygon,#mermaid-svg-SFLYneuR4H3Hjizm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SFLYneuR4H3Hjizm .rough-node .label text,#mermaid-svg-SFLYneuR4H3Hjizm .node .label text,#mermaid-svg-SFLYneuR4H3Hjizm .image-shape .label,#mermaid-svg-SFLYneuR4H3Hjizm .icon-shape .label{text-anchor:middle;}#mermaid-svg-SFLYneuR4H3Hjizm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SFLYneuR4H3Hjizm .rough-node .label,#mermaid-svg-SFLYneuR4H3Hjizm .node .label,#mermaid-svg-SFLYneuR4H3Hjizm .image-shape .label,#mermaid-svg-SFLYneuR4H3Hjizm .icon-shape .label{text-align:center;}#mermaid-svg-SFLYneuR4H3Hjizm .node.clickable{cursor:pointer;}#mermaid-svg-SFLYneuR4H3Hjizm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SFLYneuR4H3Hjizm .arrowheadPath{fill:#333333;}#mermaid-svg-SFLYneuR4H3Hjizm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SFLYneuR4H3Hjizm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SFLYneuR4H3Hjizm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SFLYneuR4H3Hjizm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SFLYneuR4H3Hjizm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SFLYneuR4H3Hjizm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SFLYneuR4H3Hjizm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SFLYneuR4H3Hjizm .cluster text{fill:#333;}#mermaid-svg-SFLYneuR4H3Hjizm .cluster span{color:#333;}#mermaid-svg-SFLYneuR4H3Hjizm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SFLYneuR4H3Hjizm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SFLYneuR4H3Hjizm rect.text{fill:none;stroke-width:0;}#mermaid-svg-SFLYneuR4H3Hjizm .icon-shape,#mermaid-svg-SFLYneuR4H3Hjizm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SFLYneuR4H3Hjizm .icon-shape p,#mermaid-svg-SFLYneuR4H3Hjizm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SFLYneuR4H3Hjizm .icon-shape .label rect,#mermaid-svg-SFLYneuR4H3Hjizm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SFLYneuR4H3Hjizm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SFLYneuR4H3Hjizm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SFLYneuR4H3Hjizm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第二步整体右旋结果
5
4
7
2
6
10
局部左旋结果
7
5
10
4
6
2
第一步局部左旋
7
4
10
2
5
6
第一步局部左旋
局部左旋结果
第二步整体右旋结果

右右 (RR)、右左 (RL) 与左左、左右镜像对称,不再赘述。

判断与恢复平衡的伪代码:

java 复制代码
// 插入节点后,从插入点向上回溯,检查每个节点的平衡因子 
void rebalance(TreeNode node) {
    while (node != null) {
        // 计算平衡因子 = 左子树高度 - 右子树高度 
        int balance = getHeight(node.left) - getHeight(node.right);
 
        if (balance > 1) {                 // 左子树过高 
            if (getHeight(node.left.left) >= getHeight(node.left.right)) {
                // 左左情况 → 一次右旋 
                node = node.rotateRight();
            } else {
                // 左右情况 → 先左旋左子节点,再右旋当前节点 
                node.left = node.left.rotateLeft();
                node = node.rotateRight();
            }
        } else if (balance < -1) {         // 右子树过高 
            if (getHeight(node.right.right) >= getHeight(node.right.left)) {
                // 右右情况 → 一次左旋 
                node = node.rotateLeft();
            } else {
                // 右左情况 → 先右旋右子节点,再左旋当前节点 
                node.right = node.right.rotateRight();
                node = node.rotateLeft();
            }
        } else {
            // 平衡,无需旋转 
        }
        // 向上回溯 
        node = node.parent;
    }
}

总结

本文从最基本的节点结构开始,循序渐进地介绍了二叉树、二叉查找树和平衡二叉树的概念与操作,并重点讲解了平衡二叉树通过左旋、右旋维持平衡的机制。

理解这些数据结构是学习 Java 中 TreeSetTreeMap 底层红黑树的基础。红黑树是一种更复杂的自平衡二叉查找树,它同样依赖旋转操作来保持近似平衡,从而保证查找、插入、删除的最坏时间复杂度为 O(log n)。

联系红黑树的结构和规则,进一步完善对 TreeSet 底层实现的理解。