File tree Expand file tree Collapse file tree 7 files changed +67
-1
lines changed
docs/cs-basics/data-structure Expand file tree Collapse file tree 7 files changed +67
-1
lines changed Original file line number Diff line number Diff line change 6
6
7
7
# 红黑树
8
8
9
- ** 红黑树特点** :
9
+ ## 红黑树数据结构
10
+
11
+ 建立在 BST 二叉搜索树的基础上,AVL、2-3树、红黑树都是自平衡二叉树(统称B-树)。但相比于AVL树,高度平衡所带来的时间复杂度,红黑树对平衡的控制要宽松一些,红黑树只需要保证黑色节点平衡即可。
12
+
13
+ ## ** 红黑树特点**
10
14
11
15
1 . 每个节点非红即黑;
16
+
17
+ 黑色决定平衡,红色不决定平衡。这对应了2-3树中一个节点内可以存放1~ 2个节点。
18
+
12
19
2 . 根节点总是黑色的;
20
+
13
21
3 . 每个叶子节点都是黑色的空节点(NIL 节点);
22
+
23
+ 这里指的是红黑树都会有一个空的叶子节点,是红黑树自己的规则。
24
+
14
25
4 . 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
26
+
27
+ 通常这条规则也叫不会有连续的红色节点。一个节点最多临时会有3个节点,中间是黑色节点,左右是红色节点。
28
+
15
29
5 . 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。
16
30
31
+ 每一层都只是有一个节点贡献了树高决定平衡性,也就是对应红黑树中的黑色节点。
32
+
33
+ ## 红黑树结构实现
34
+
35
+ ``` java
36
+ public class Node {
37
+
38
+ public Class<?> clazz;
39
+ public Integer value;
40
+ public Node parent;
41
+ public Node left;
42
+ public Node right;
43
+
44
+ // AVL 树所需属性
45
+ public int height;
46
+ // 红黑树所需属性
47
+ public Color color = Color . RED ;
48
+
49
+ }
50
+ ```
51
+
52
+ ### 1.左倾染色
53
+
54
+ ![ 幻灯片1] ( pictures/红黑树/红黑树1.PNG )
55
+
56
+ - 染色时根据当前节点的爷爷节点,找到当前节点的叔叔节点。
57
+ - 再把父节点染黑、叔叔节点染黑,爷爷节点染红。但爷爷节点染红是临时的,当平衡树高操作后会把根节点染黑。
58
+
59
+ ### 2.右倾染色
60
+
61
+ ![ 幻灯片2] ( pictures/红黑树/红黑树2.PNG )
62
+
63
+ ### 3.左旋调衡
64
+
65
+ #### 3.1一次左旋
66
+
67
+ ![ 幻灯片3] ( pictures/红黑树/红黑树3.PNG )
68
+
69
+ #### 3.2右旋+左旋
70
+
71
+ ![ 幻灯片4] ( pictures/红黑树/红黑树4.PNG )
72
+
73
+ ### 4.右旋调衡
74
+
75
+ #### 4.1一次右旋
76
+
77
+ ![ 幻灯片5] ( pictures/红黑树/红黑树5.PNG )
78
+
79
+ #### 4.2左旋+右旋
80
+
81
+ ![ 幻灯片6] ( pictures/红黑树/红黑树6.PNG )
82
+
17
83
** 红黑树的应用** :TreeMap、TreeSet 以及 JDK1.8 的 HashMap 底层都用到了红黑树。
18
84
19
85
** 为什么要用红黑树?** 简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。详细了解可以查看 [ 漫画:什么是红黑树?] ( https://juejin.im/post/5a27c6946fb9a04509096248#comment ) (也介绍到了二叉查找树,非常推荐)
You can’t perform that action at this time.
0 commit comments