6
6
7
7
之所以把这种数据结构称为「树」是因为这种数据结构看起来就像是一棵倒挂的树,也就是说数据结构中的「树」是根朝上,而叶朝下的。如下图所示。
8
8
9
- ![ ] ( https://qcdn.itcharge.cn/images/20220221091603 .png )
9
+ ![ 树 ] ( https://qcdn.itcharge.cn/images/20240511171215 .png )
10
10
11
11
「树」具有以下的特点:
12
12
17
17
18
18
如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 $3$ 棵互不相交的子树 $T_1(B, E, H, I, G)$、$T_2(C)$、$T_3(D, F, G, K)$。
19
19
20
- ![ ] ( https://qcdn.itcharge.cn/images/20220218104556.png )
21
-
22
-
20
+ ![ 树与子树] ( https://qcdn.itcharge.cn/images/20240511171233.png )
23
21
24
22
### 1.2 树的相关术语
25
23
29
27
30
28
** 「树的节点」** 由一个数据元素和若干个指向其子树的树的分支组成。而节点所含有的子树个数称为 ** 「节点的度」** 。度为 $0$ 的节点称为 ** 「叶子节点」** 或者 ** 「终端节点」** ,度不为 $0$ 的节点称为 ** 「分支节点」** 或者 ** 「非终端节点」** 。树中各节点的最大度数称为 ** 「树的度」** 。
31
29
32
- ![ ] ( https://qcdn.itcharge.cn/images/20220218134918 .png )
30
+ ![ 节点分类 ] ( https://qcdn.itcharge.cn/images/20240511171300 .png )
33
31
34
32
- ** 树的节点** :由一个数据元素和若干个指向其子树的树的分支组成。
35
33
- ** 节点的度** :一个节点所含有的子树个数。
41
39
42
40
一个节点的子树的根节点称为该节点的 ** 「孩子节点」** ,相应的,该节点称为孩子的 ** 「父亲节点」** 。同一个父亲节点的孩子节点之间互称为 ** 「兄弟节点」** 。
43
41
44
- ![ ] ( https://qcdn.itcharge.cn/images/20220218142604 .png )
42
+ ![ 节点间关系 ] ( https://qcdn.itcharge.cn/images/20240511171311 .png )
45
43
46
44
- ** 孩子节点(子节点)** :一个节点含有的子树的根节点称为该节点的子节点。例如图中 $B$ 是 $A$ 的孩子节点。
47
45
- ** 父亲节点(父节点)** :如果一个节点含有子节点,则这个节点称为其子节点的父节点。例如图中 $B$ 是 $E$ 的父亲节点。
51
49
52
50
** 「节点的层次」** 是从根节点开始定义,将根节点作为第 1 层,根的孩子节点作为第 2 层,以此类推,如果某个节点在第 $i$ 层,则其孩子节点在第 $i + 1$ 层。而父亲节点在同一层的节点互为 ** 「堂兄弟节点」** 。树中所有节点最大的层数称为 ** 「树的深度」** 或 ** 「树的高度」** 。树中,两个节点之间所经过节点序列称为 ** 「路径」** ,两个节点之间路径上经过的边数称为 ** 「路径长度」** 。
53
51
54
- ![ 树的其他术语] ( https://qcdn.itcharge.cn/images/20231225174453 .png )
52
+ ![ 树的其他术语] ( https://qcdn.itcharge.cn/images/20240511171325 .png )
55
53
56
54
- ** 节点的层次** :从根节点开始定义,根为第 $1$ 层,根的子节点为第 $2$ 层,以此类推。
57
55
- ** 树的深度(高度)** :所有节点中最大的层数。例如图中树的深度为 $4$。
78
76
79
77
下图就是一棵二叉树。
80
78
81
- ![ ] ( https://qcdn.itcharge.cn/images/20220221094909 .png )
79
+ ![ 二叉树 ] ( https://qcdn.itcharge.cn/images/20240511171342 .png )
82
80
83
81
二叉树也可以使用递归方式来定义,即二叉树满足以下两个要求之一:
84
82
89
87
90
88
二叉树在逻辑上可以分为 $5$ 种基本形态,如下图所示。
91
89
92
- ![ ] ( https://qcdn.itcharge.cn/images/20220218164839.png )
90
+ ![ 二叉树的形态 ] ( https://qcdn.itcharge.cn/images/20220218164839.png )
93
91
94
92
### 2.2 特殊的二叉树
95
93
109
107
110
108
我们可以来看几个例子。
111
109
112
- ![ ] ( https://qcdn.itcharge.cn/images/20220218173007.png )
110
+ ![ 满二叉树与非满二叉树 ] ( https://qcdn.itcharge.cn/images/20220218173007.png )
113
111
114
112
#### 2.2.2 完全二叉树
115
113
127
125
128
126
我们可以来看几个例子。
129
127
130
- ![ ] ( https://qcdn.itcharge.cn/images/20220218174000.png )
128
+ ![ 完全二叉树与非完全二叉树 ] ( https://qcdn.itcharge.cn/images/20220218174000.png )
131
129
132
130
#### 2.2.3 二叉搜索树
133
131
139
137
140
138
如图所示,这 $3$ 棵树都是二叉搜索树。
141
139
142
- ![ ] ( https://qcdn.itcharge.cn/images/20220218175944 .png )
140
+ ![ 二叉搜索树 ] ( https://qcdn.itcharge.cn/images/20240511171406 .png )
143
141
144
142
#### 2.2.4 平衡二叉搜索树
145
143
153
151
154
152
如图所示,前 $2$ 棵树是平衡二叉搜索树,最后一棵树不是平衡二叉搜索树,因为这棵树的左右子树的高度差的绝对值超过了 $1$。
155
153
156
- ![ ] ( https://qcdn.itcharge.cn/images/20220221103552.png )
154
+ ![ 平衡二叉树与非平衡二叉树 ] ( https://qcdn.itcharge.cn/images/20220221103552.png )
157
155
158
156
### 2.3 二叉树的存储结构
159
157
167
165
168
166
下图为二叉树的顺序存储结构。
169
167
170
- ![ ] ( https://qcdn.itcharge.cn/images/20220221144552 .png )
168
+ ![ 二叉树的顺序存储结构 ] ( https://qcdn.itcharge.cn/images/20240511171423 .png )
171
169
172
170
从图中我们也可以看出节点之间的逻辑关系。
173
171
180
178
181
179
二叉树采用链式存储结构时,每个链节点包含一个用于数据域 $val$,存储节点信息;还包含两个指针域 $left$ 和 $right$,分别指向左右两个孩子节点,当左孩子或者右孩子不存在时,相应指针域值为空。二叉链节点结构如下图所示。
182
180
183
- ![ ] ( https://qcdn.itcharge.cn/images/20220221151412 .png )
181
+ ![ 二叉链节点 ] ( https://qcdn.itcharge.cn/images/20240511171434 .png )
184
182
185
183
二叉链节点结构的对应代码为:
186
184
@@ -194,7 +192,7 @@ class TreeNode:
194
192
195
193
下面我们将值为 $[ 1, 2, 3, 4, 5, 6, 7] $ 的二叉树使用链式存储结构进行存储,即为下图所示。
196
194
197
- ![ ] ( https://qcdn.itcharge.cn/images/20220221153539 .png )
195
+ ![ 二叉树的链式存储结构 ] ( https://qcdn.itcharge.cn/images/20240511171446 .png )
198
196
199
197
二叉树的链表存储结构具有灵活、方便的特点。节点的最大数目只受系统最大可存储空间的限制。一般情况下,二叉树的链表存储结构比顺序存储结构更省空间(用于存储指针域的空间开销只是二叉树中节点数的线性函数),而且对于二叉树实施相关操作也很方便,因此,一般我们使用链式存储结构来存储二叉树。
200
198
0 commit comments