66
77之所以把这种数据结构称为「树」是因为这种数据结构看起来就像是一棵倒挂的树,也就是说数据结构中的「树」是根朝上,而叶朝下的。如下图所示。
88
9- ![ ] ( https://qcdn.itcharge.cn/images/20220221091603 .png )
9+ ![ 树 ] ( https://qcdn.itcharge.cn/images/20240511171215 .png )
1010
1111「树」具有以下的特点:
1212
1717
1818如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 $3$ 棵互不相交的子树 $T_1(B, E, H, I, G)$、$T_2(C)$、$T_3(D, F, G, K)$。
1919
20- ![ ] ( https://qcdn.itcharge.cn/images/20220218104556.png )
21-
22-
20+ ![ 树与子树] ( https://qcdn.itcharge.cn/images/20240511171233.png )
2321
2422### 1.2 树的相关术语
2523
2927
3028** 「树的节点」** 由一个数据元素和若干个指向其子树的树的分支组成。而节点所含有的子树个数称为 ** 「节点的度」** 。度为 $0$ 的节点称为 ** 「叶子节点」** 或者 ** 「终端节点」** ,度不为 $0$ 的节点称为 ** 「分支节点」** 或者 ** 「非终端节点」** 。树中各节点的最大度数称为 ** 「树的度」** 。
3129
32- ![ ] ( https://qcdn.itcharge.cn/images/20220218134918 .png )
30+ ![ 节点分类 ] ( https://qcdn.itcharge.cn/images/20240511171300 .png )
3331
3432- ** 树的节点** :由一个数据元素和若干个指向其子树的树的分支组成。
3533- ** 节点的度** :一个节点所含有的子树个数。
4139
4240一个节点的子树的根节点称为该节点的 ** 「孩子节点」** ,相应的,该节点称为孩子的 ** 「父亲节点」** 。同一个父亲节点的孩子节点之间互称为 ** 「兄弟节点」** 。
4341
44- ![ ] ( https://qcdn.itcharge.cn/images/20220218142604 .png )
42+ ![ 节点间关系 ] ( https://qcdn.itcharge.cn/images/20240511171311 .png )
4543
4644- ** 孩子节点(子节点)** :一个节点含有的子树的根节点称为该节点的子节点。例如图中 $B$ 是 $A$ 的孩子节点。
4745- ** 父亲节点(父节点)** :如果一个节点含有子节点,则这个节点称为其子节点的父节点。例如图中 $B$ 是 $E$ 的父亲节点。
5149
5250** 「节点的层次」** 是从根节点开始定义,将根节点作为第 1 层,根的孩子节点作为第 2 层,以此类推,如果某个节点在第 $i$ 层,则其孩子节点在第 $i + 1$ 层。而父亲节点在同一层的节点互为 ** 「堂兄弟节点」** 。树中所有节点最大的层数称为 ** 「树的深度」** 或 ** 「树的高度」** 。树中,两个节点之间所经过节点序列称为 ** 「路径」** ,两个节点之间路径上经过的边数称为 ** 「路径长度」** 。
5351
54- ![ 树的其他术语] ( https://qcdn.itcharge.cn/images/20231225174453 .png )
52+ ![ 树的其他术语] ( https://qcdn.itcharge.cn/images/20240511171325 .png )
5553
5654- ** 节点的层次** :从根节点开始定义,根为第 $1$ 层,根的子节点为第 $2$ 层,以此类推。
5755- ** 树的深度(高度)** :所有节点中最大的层数。例如图中树的深度为 $4$。
7876
7977下图就是一棵二叉树。
8078
81- ![ ] ( https://qcdn.itcharge.cn/images/20220221094909 .png )
79+ ![ 二叉树 ] ( https://qcdn.itcharge.cn/images/20240511171342 .png )
8280
8381二叉树也可以使用递归方式来定义,即二叉树满足以下两个要求之一:
8482
8987
9088二叉树在逻辑上可以分为 $5$ 种基本形态,如下图所示。
9189
92- ![ ] ( https://qcdn.itcharge.cn/images/20220218164839.png )
90+ ![ 二叉树的形态 ] ( https://qcdn.itcharge.cn/images/20220218164839.png )
9391
9492### 2.2 特殊的二叉树
9593
109107
110108我们可以来看几个例子。
111109
112- ![ ] ( https://qcdn.itcharge.cn/images/20220218173007.png )
110+ ![ 满二叉树与非满二叉树 ] ( https://qcdn.itcharge.cn/images/20220218173007.png )
113111
114112#### 2.2.2 完全二叉树
115113
127125
128126我们可以来看几个例子。
129127
130- ![ ] ( https://qcdn.itcharge.cn/images/20220218174000.png )
128+ ![ 完全二叉树与非完全二叉树 ] ( https://qcdn.itcharge.cn/images/20220218174000.png )
131129
132130#### 2.2.3 二叉搜索树
133131
139137
140138如图所示,这 $3$ 棵树都是二叉搜索树。
141139
142- ![ ] ( https://qcdn.itcharge.cn/images/20220218175944 .png )
140+ ![ 二叉搜索树 ] ( https://qcdn.itcharge.cn/images/20240511171406 .png )
143141
144142#### 2.2.4 平衡二叉搜索树
145143
153151
154152如图所示,前 $2$ 棵树是平衡二叉搜索树,最后一棵树不是平衡二叉搜索树,因为这棵树的左右子树的高度差的绝对值超过了 $1$。
155153
156- ![ ] ( https://qcdn.itcharge.cn/images/20220221103552.png )
154+ ![ 平衡二叉树与非平衡二叉树 ] ( https://qcdn.itcharge.cn/images/20220221103552.png )
157155
158156### 2.3 二叉树的存储结构
159157
167165
168166下图为二叉树的顺序存储结构。
169167
170- ![ ] ( https://qcdn.itcharge.cn/images/20220221144552 .png )
168+ ![ 二叉树的顺序存储结构 ] ( https://qcdn.itcharge.cn/images/20240511171423 .png )
171169
172170从图中我们也可以看出节点之间的逻辑关系。
173171
180178
181179二叉树采用链式存储结构时,每个链节点包含一个用于数据域 $val$,存储节点信息;还包含两个指针域 $left$ 和 $right$,分别指向左右两个孩子节点,当左孩子或者右孩子不存在时,相应指针域值为空。二叉链节点结构如下图所示。
182180
183- ![ ] ( https://qcdn.itcharge.cn/images/20220221151412 .png )
181+ ![ 二叉链节点 ] ( https://qcdn.itcharge.cn/images/20240511171434 .png )
184182
185183二叉链节点结构的对应代码为:
186184
@@ -194,7 +192,7 @@ class TreeNode:
194192
195193下面我们将值为 $[ 1, 2, 3, 4, 5, 6, 7] $ 的二叉树使用链式存储结构进行存储,即为下图所示。
196194
197- ![ ] ( https://qcdn.itcharge.cn/images/20220221153539 .png )
195+ ![ 二叉树的链式存储结构 ] ( https://qcdn.itcharge.cn/images/20240511171446 .png )
198196
199197二叉树的链表存储结构具有灵活、方便的特点。节点的最大数目只受系统最大可存储空间的限制。一般情况下,二叉树的链表存储结构比顺序存储结构更省空间(用于存储指针域的空间开销只是二叉树中节点数的线性函数),而且对于二叉树实施相关操作也很方便,因此,一般我们使用链式存储结构来存储二叉树。
200198
0 commit comments