目录
第1章数据结构概述1
1.1基本概念1
1.1.1数据、数据元素、数据对象1
1.1.2数据结构2
1.2数据结构的分类3
1.3数据类型5
1.3.1基本类型和组合类型5
1.3.2抽象数据类型5
1.4算法和算法分析8
1.4.1算法概念8
1.4.2算法分析9
习题11
第2章向量、栈和队列13
2.1线性表13
2.1.1线性表的抽象数据类型13
2.1.2线性表的结构表示15
2.2向量18
2.2.1向量的抽象数据类型18
2.2.2向量的插入和删除20
2.2.3向量的应用22
2.3栈25
2.3.1栈的抽象数据类型及其实现25
2.3.2栈的应用27
2.4递归效率分析34
2.4.1递归方程求解34
2.4.2生成函数求解递归方程35
2.4.3特征方程求解递归方程36
2.4.4递归树方法37
2.5队列38
2.5.1队列的抽象数据类型及其实现39
2.5.2队列的应用——模拟银行活动44
习题51
第3章链表53
3.1单链表53
3.1.1基本概念53
3.1.2单链表结点结构54
3.1.3单链表结构56
3.1.4栈的单链表实现65
3.1.5队列的单链表实现66
3.1.6单链表的应用举例70
3.2循环链表74
3.3双链表76
习题78
第4章串81
4.1基本概念81
4.2串的存储82
4.3串结构和串的运算83
4.4模式匹配85
4.4.1朴素的模式匹配算法85
4.4.2KMP匹配算法86
4.4.3BM匹配算法89
习题91
第5章排序93
5.1基本概念93
5.2插入排序94
5.2.1直接插入排序94
5.2.2折半插入排序95
5.2.3Shell排序97
5.3选择排序99
5.3.1直接选择排序99
5.3.2树形选择排序100
5.4交换排序101
5.4.1起泡排序101
5.4.2快速排序103
5.5分配排序106
5.5.1基本思想106
5.5.2基数排序107
5.6归并排序110
5.7外部排序113
5.7.1二路合并排序113
5.7.2多路替代选择合并排序114
5.7.3最佳合并排序114
习题116
第6章查找117
6.1基本概念117
6.2顺序查找117
6.3折半查找119
6.4分块查找121
6.5散列查找123
6.5.1概述123
6.5.2散列函数124
6.5.3冲突的处理126
6.5.4散列查找的效率129
习题130
第7章树和二叉树132
7.1树的概念132
7.2二叉树133
7.2.1二叉树的概念133
7.2.2二叉树的性质133
7.2.3二叉树的存储方式136
7.2.4树(树林)与二叉树的相互转换138
7.3树(树林)、二叉树的遍历139
7.3.1树(树林)的遍历139
7.3.2二叉树的遍历139
7.4抽象数据类型BinaryTree以及BinaryTree结构140
7.4.1抽象数据类型BinaryTree140
7.4.2一个完整的包含构建二叉树与遍历实现的例子142
7.5二叉树的遍历算法143
7.5.1非递归(使用栈)的遍历算法143
7.5.2线索化二叉树的遍历145
习题148
第8章树结构的应用150
8.1二叉排序树150
8.1.1二叉排序树与BinarySTree结构150
8.1.2二叉排序树的检索、插入、删除运算151
8.1.3等概率查找对应的最佳二叉排序树154
8.2平衡的二叉排序树157
8.2.1平衡二叉排序树的定义157
8.2.2平衡二叉排序树的插入、删除157
8.2.3AVL树高度161
8.3B树、B+树161
8.4键树和23树165
8.4.1键树165
8.4.223树167
8.5Huffman最优树与树编码168
8.5.1Huffman最优树168
8.5.2树编码171
8.6堆排序173
8.7判定树178
8.8等价类和并查集179
8.8.1等价类179
8.8.2并查集180
8.9红黑树182
8.10跳表186
8.10.1跳表时间复杂度分析187
8.10.2跳表的空间复杂度分析187
8.10.3高效的动态插入和删除188
8.10.4小结189
习题189
第9章图191
9.1基本概念191
9.2图的存储表示193
9.2.1相邻矩阵表示图193
9.2.2图的邻接表表示194
9.2.3邻接多重表195
9.3基于邻接表表示的Graph结构197
9.4图的遍历197
9.4.1深度优先遍历198
9.4.2广度优先遍历200
9.5最小代价生成树201
9.6单源最短路径问题205
9.7每一对顶点间的最短路径问题208
9.8有向无回路图209
9.8.1DAG图和AOV、AOE网209
9.8.2AOV网的拓扑排序211
9.8.3AOE网的关键路径213
习题215
第10章算法设计与分析217
10.1递归与分治217
10.1.1递归方法设计217
10.1.2分治法218
10.2回溯法220
10.3分支限界法225
10.4贪心算法231
10.5动态规划法232
10.6数据结构中的Catalan数235
10.6.1问题描述235
10.6.2问题解析235
10.6.3递归方程求解236
习题237
关键词索引239
参考文献242
第1章数据结构概述1
1.1基本概念1
1.1.1数据、数据元素、数据对象1
1.1.2数据结构2
1.2数据结构的分类3
1.3数据类型5
1.3.1基本类型、组合类型5
1.3.2抽象数据类型5
1.4算法和算法分析8
1.4.1算法概念8
1.4.2算法分析9
习题11第2章向量、栈和队列13
2.1线性表13
2.1.1线性表的抽象数据类型13
2.1.2线性表的结构表示15
2.2向量18
2.2.1向量的抽象数据类型18
2.2.2向量的插入和删除20
2.2.3向量的应用23
2.3栈26
2.3.1栈的抽象数据类型及其实现26
2.3.2栈的应用29
2.4递归效率分析36
2.4.1递归方程求解36
2.4.2生成函数求解递归方程37
2.4.3特征方程求解递归方程38
2.4.4递归树方法39
2.5队列40
2.5.1队列的抽象数据类型及其实现40
2.5.2队列的应用——模拟银行活动46
习题54第3章链表56
3.1单链表56
3.1.1基本概念56
3.1.2单链表结点结构57
3.1.3单链表结构59
3.1.4栈的单链表实现70
3.1.5队列的单链表实现71
3.1.6单链表的应用举例75
3.2循环链表80
3.3双链表82
习题84第4章串87
4.1基本概念87
4.2串的存储88
4.3串结构和串的运算89
4.4模式匹配91
4.4.1朴素的模式匹配算法91
4.4.2KMP匹配算法92
4.4.3BM匹配算法95
习题98第5章排序99
5.1基本概念99
5.2插入排序100
5.2.1直接插入排序100
5.2.2折半插入排序102
5.2.3Shell排序104
5.3选择排序105
5.3.1直接选择排序105
5.3.2树形选择排序107
5.4交换排序108
5.4.1起泡排序108
5.4.2快速排序109
5.5分配排序113
5.5.1基本思想113
5.5.2基数排序114
5.6归并排序117
5.7外部排序120
5.7.1二路合并排序120
5.7.2多路替代选择合并排序121
5.7.3最佳合并排序122
习题123第6章查找125
6.1基本概念125
6.2顺序查找125
6.3折半查找127
6.4分块查找129
6.5散列查找131
6.5.1概述131
6.5.2散列函数132
6.5.3冲突的处理134
6.5.4散列查找的效率137
习题138第7章树和二叉树140
7.1树的概念140
7.2二叉树141
7.2.1二叉树的概念141
7.2.2二叉树的性质141
7.2.3二叉树的存储方式144
7.2.4树(树林)与二叉树的相互转换146
7.3树(树林)、二叉树的遍历147
7.3.1树(树林)的遍历147
7.3.2二叉树的遍历147
7.4抽象数据类型BinaryTree以及BinaryTree结构148
7.4.1抽象数据类型BinaryTree148
7.4.2一个完整的包含构建二叉树与遍历实现的例子150
7.5二叉树的遍历算法151
7.5.1非递归(使用栈)的遍历算法151
7.5.2线索化二叉树的遍历153
习题157第8章树状结构的应用159
8.1二叉排序树159
8.1.1二叉排序树与BinarySTree结构159
8.1.2二叉排序树的检索、插入、删除运算160
8.1.3等概率查找对应的最佳二叉排序树164
8.2平衡的二叉排序树166
8.2.1平衡二叉排序树的定义166
8.2.2平衡二叉排序树的插入、删除167
8.2.3AVL树高度170
8.3B树、B+树171
8.4键树和23树175
8.4.1键树175
8.4.223树177
8.5Huffman最优树与树编码178
8.5.1Huffman最优树178
8.5.2树编码181
8.6堆排序183
8.7判定树189
8.8等价类和并查集190
8.8.1等价类190
8.8.2并查集190
8.9红黑树193
8.10跳表197
8.10.1跳表时间复杂度分析198
8.10.2跳表的空间复杂度分析198
8.10.3高效的动态插入和删除199
8.10.4小结200
习题201第9章图203
9.1基本概念203
9.2图的存储表示205
9.2.1相邻矩阵表示图205
9.2.2图的邻接表表示206
9.2.3邻接多重表207
9.3基于邻接表表示的Graph结构209
9.4图的遍历210
9.4.1深度优先遍历210
9.4.2广度优先遍历212
9.5最小代价生成树213
9.6单源最短路径问题217
9.7每一对顶点间的最短路径问题220
9.8有向无回路图222
9.8.1DAG图和AOV、AOE网222
9.8.2AOV网的拓扑排序224
9.8.3AOE网的关键路径226
习题228第10章算法设计与分析230
10.1递归与分治230
10.1.1递归方法设计230
10.1.2分治法231
10.2回溯法233
10.3分支限界法238
10.4贪心算法245
10.5动态规划法246
10.6数据结构中的Catalan数249
10.6.1问题描述249
10.6.2问题解析249
10.6.3递归方程求解251
习题252关键词索引254
参考文献257
第1章数据结构概述/1
1.1基本概念/1
1.1.1数据、数据元素、数据对象/1
1.1.2数据结构/2
1.2数据结构的分类/3
1.3数据类型/5
1.3.1基本类型、组合类型/5
1.3.2抽象数据类型/5
1.4算法和算法分析/8
1.4.1算法概念/8
1.4.2算法分析/9
习题/11第2章向量、栈和队列/13
2.1线性表/13
2.1.1线性表的抽象数据类型/13
2.1.2线性表的结构表示/15
2.2向量/18
2.2.1向量的抽象数据类型/18
2.2.2向量的插入和删除/20
2.2.3向量的应用/23
2.3栈/26
2.3.1栈的抽象数据类型及其实现/26
2.3.2栈的应用/29
2.4递归效率分析/36
2.4.1递归方程求解/36
2.4.2生成函数求解递归方程/37
2.4.3特征方程求解递归方程/38
2.4.4递归树方法/39
2.5队列/40
2.5.1队列的抽象数据类型及其实现/40
2.5.2队列的应用——模拟银行活动/46
习题/54
第3章链表/56
3.1单链表/56
3.1.1基本概念/56
3.1.2单链表结点结构/57
3.1.3单链表结构/59
3.1.4栈的单链表实现/70
3.1.5队列的单链表实现/71
3.1.6单链表的应用举例/75
3.2循环链表/80
3.3双链表/82
习题/84第4章串/87
4.1基本概念/87
4.2串的存储/88
4.3串结构和串的运算/89
4.4模式匹配/91
4.4.1朴素的模式匹配算法/91
4.4.2KMP匹配算法/92
4.4.3BM匹配算法/95
习题/98第5章排序/99
5.1基本概念/99
5.2插入排序/100
5.2.1直接插入排序/100
5.2.2折半插入排序/102
5.2.3Shell排序/104
5.3选择排序/105
5.3.1直接选择排序/105
5.3.2树形选择排序/107
5.4交换排序/108
5.4.1起泡排序/108
5.4.2快速排序/109
5.5分配排序/113
5.5.1基本思想/113
5.5.2基数排序/114
5.6归并排序/117
5.7外部排序/120
5.7.1二路合并排序/120
5.7.2多路替代选择合并排序/121
5.7.3最佳合并排序/122
习题/123第6章查找/125
6.1基本概念/125
6.2顺序查找/125
6.3折半查找/127
6.4分块查找/129
6.5散列查找/131
6.5.1概述/131
6.5.2散列函数/132
6.5.3冲突的处理/134
6.5.4散列查找的效率/137
习题/138第7章树和二叉树/140
7.1树的概念/140
7.2二叉树/141
7.2.1二叉树的概念/141
7.2.2二叉树的性质/141
7.2.3二叉树的存储方式/144
7.2.4树(树林)与二叉树的相互转换/146
7.3树(树林)、二叉树的遍历/147
7.3.1树(树林)的遍历/147
7.3.2二叉树的遍历/147
7.4抽象数据类型BinaryTree以及BinaryTree
结构/148
7.4.1抽象数据类型BinaryTree/148
7.4.2一个完整的包含构建二叉树与遍历
实现的例子/150
7.5二叉树的遍历算法/151
7.5.1非递归(使用栈)的遍历算法/151
7.5.2线索化二叉树的遍历/153
习题/157第8章树状结构的应用/159
8.1二叉排序树/159
8.1.1二叉排序树与BinarySTree结构/159
8.1.2二叉排序树的检索、插入、删除
运算/160
8.1.3等概率查找对应的最佳二叉排
序树/164
8.2平衡的二叉排序树/166
8.2.1平衡二叉排序树的定义/166
8.2.2平衡二叉排序树的插入、
删除/167
8.2.3AVL树高度/170
8.3B树、B+树/171
8.4键树和23树/175
8.4.1键树/175
8.4.223树/176
8.5Huffman最优树与树编码/178
8.5.1Huffman最优树/178
8.5.2树编码/181
8.6堆排序/183
8.7判定树/189
8.8等价类和并查集/190
8.8.1等价类/190
8.8.2并查集/190
8.9红黑树/193
习题/197第9章图/199
9.1基本概念/199
9.2图的存储表示/201
9.2.1相邻矩阵表示图/201
9.2.2图的邻接表表示/202
9.2.3邻接多重表/203
9.3基于邻接表表示的Graph结构/205
9.4图的遍历/206
9.4.1深度优先遍历/206
9.4.2广度优先遍历/208
9.5最小代价生成树/209
9.6单源最短路径问题/213
9.7每一对顶点间的最短路径问题/216
9.8有向无回路图/218
9.8.1DAG图和AOV、AOE网/218
9.8.2AOV网的拓扑排序/220
9.8.3AOE网的关键路径/222
习题/224第10章算法设计与分析/226
10.1递归与分治/226
10.1.1递归方法设计/226
10.1.2分治法/227
10.2回溯法/229
10.3分支限界法/234
10.4贪心算法/241
10.5动态规划法/242
习题/245图目录/247算法目录/252关键词索引/247参考文献/250图目录
图1.1基本的逻辑结构3
图1.2基本存储方法4
图1.3游泳池及环形过道8
图2.1向量的顺序存储19
图2.2顺序存储的栈26
图2.3中缀表达式的计值过程30
图2.4后缀表达式的计值30
图2.5中缀表达式转换成后缀表达式的过程31
图2.6汉诺塔问题的递归求解过程33
图2.7活动记录的进栈情况35
图2.8活动记录的退栈情况36
图2.9式(2.1)的递归树39
图2.10式(2.2)的递归树40
图2.11顺序存储的队列40
图2.12队列的操作41
图2.13循环队列的队空和队满41
图3.1单链表56
图3.2从链表中删除一个结点56
图3.3往链表中插入一个结点56
图3.4附加头结点的单链表57
图3.5一个实际的单链表结构65
图3.6空的循环链表80
图3.7双链表结点82
图3.8双链表82
图3.9往双链表中插入一个结点82
图3.10从双链表中删除一个结点82
图3.11题3.2用图85
图4.1串的顺序存储88图4.2串的紧缩顺序存储88
图4.3串的链接存储89
图4.4第1趟比较91
图4.5第2趟比较92
图4.6朴素的模式匹配算法执行过程92
图4.7模式P="abcabcd"的next数组的计算过程95
图4.8基于KMP匹配算法的模式匹配过程96
图5.1直接插入排序的过程100
图5.2折半查找过程102
图5.3Shell排序过程104
图5.4直接选择排序106
图5.5第一次树形选择排序选出最小排序码13107
图5.6第二次树形选择排序选出最小排序码14107
图5.7起泡排序过程108
图5.8第1趟快速排序的比较过程110
图5.9基数排序的分配和收集过程115
图5.10二路归并过程118
图5.11二路归并排序示意121
图5.12实现五路合并败者树122
图5.13实现五路合并一次替代选择后的败者树122
图5.14顺序合并的三路合并树122
图5.15三路最佳合并树123
图6.1折半查找过程128
图6.2分块查找过程130
图6.3用分离的同义词子表解决冲突137
图6.4用结合的同义词子表解决冲突137
图6.5几种不同的解决碰撞方法时的平均检索长度(横坐标为负载因子的
取值)138
图6.6题6.8用图139
图7.1家族树140
图7.2二叉树的五种基本形态141
图7.3表达式二叉树142
图7.4深度为3的满二叉树142
图7.5特殊的二叉树143
图7.6i与i+1在同一层的完全二叉树143
图7.7i与i+1不在同一层的完全二叉树143
图7.8完全二叉树的顺序存储144
图7.9非完全二叉树的顺序存储144
图7.10二叉树的LeftChildRightChild表示145
图7.11树(树林)与二叉树之间相互转换146
图7.12树林的例子147
图7.13图7.12对应的二叉树148
图7.14二叉树遍历实例150
图7.15对称序线索树153
图7.16在对称序线索化二叉树中插入新结点156
图7.17题7.5用图157
图7.18题7.7用图157
图7.19题7.14用图158
图7.20题7.15用图158
图8.1二叉排序树159
图8.2构造二叉排序树162
图8.3二叉排序树中删除一个结点164
图8.4删除结点11后的另一种形式164
图8.5两种不同的二叉排序树164
图8.6两棵扩充二叉树164
图8.7最佳二叉排序树的构造165
图8.8二叉树与结点的平衡因子167
图8.9平衡的二叉排序的生成过程(带★的点为插入后引起不平衡的点)168
图8.10二叉排序树的平衡旋转169
图8.11AVL二叉排序树结点的删除(结点中右边数字代表平衡因子)170
图8.12一棵7阶的B树171
图8.13B树的插入173
图8.14图8.13中删除元素80173
图8.15图8.13中删除元素4173
图8.16在图8.15中删除元素60174
图8.17在图8.16中删除元素70174
图8.18一棵3阶的B+树174
图8.19键树示例175
图8.20由图8.19压缩后的键树176
图8.21键树中插入记录176
图8.22两棵不同形式的23树177
图8.2323树的插入177
图8.24在图8.22(b)中插入8后23树的变化图178
图8.2523树的删除178
图8.26一棵扩充的二叉树178
图8.27赫夫曼最优树的构造过程179
图8.28Huffman编码树182
图8.29堆对应的完全二叉树183
图8.30堆中插入新结点183
图8.31堆中根结点的删除184
图8.32筛法建堆过程184
图8.33堆排序过程185
图8.34三个元素排序的判定树189
图8.35鉴别伪币的判定树189
图8.36用父指针表示的树状结构存储的并查集191
图8.37并查集的查找、合并过程191
图8.38Union加权规则示意图192
图8.39路径压缩的例子193
图8.40一棵阶为2的红黑树194
图8.41红黑树的生长过程194
图8.42一棵2阶红黑树195
图8.43红黑树中删除元素88195
图8.44图8.43调整后的红黑树196
图8.45图8.44中删除元素71196
图8.46图8.45调整后的红黑树196
图8.47图8.46中删除元素63196
图8.48调整图8.47后的红黑树197
图8.49题8.15用图198
图9.1无向图和有向图199
图9.2图G4=(V,E)200
图9.3图G3的强连通分量201
图9.4G1的生成树201
图9.5G3的生成树林201
图9.6图G5(网络)201
图9.7图的邻接表表示203
图9.8G5的邻接表表示204
图9.9图9.7(a)的邻接多重表表示204
图9.10图9.7(c)的多重链表表示205
图9.11有向图深度优先搜索过程206
图9.12无向图深度方向优先遍历207
图9.13广度优先生成树(树林)209
图9.14T的变化图210
图9.15Prim算法构造最小生成树的过程211
图9.16Kruskal构造最小生成树的过程213
图9.17有向图G213
图9.18含三个顶点的有向网络217
图9.19表达式树 218
图9.20共享结点后的表达式树219
图9.21表示各课程优先关系的AOV网219
图9.22一个AOV网的例子220
图9.23图9.22的关键路径为(a1,a4,a8,a11)或(a1,a4,a7,a10)222
图9.24题9.1用图224
图9.25题9.2用图224
图9.26题9.3用图224
图9.27题9.5用图224
图9.28题9.6用图225
图9.29题9.7用图225
图9.30题9.10用图225
图9.31题9.12用图225
图10.1用01矩阵表示的迷宫230
图10.201背包问题的解空间树235
图10.3树T241
图10.4树T0241
图10.5树T1242
图10.6内部结点构造图242
图10.7题10.5用图245
算 法 目 录
算法1.1计算修建游泳池工程造价8
算法1.2计算两个n×n矩阵的乘积10
算法2.1线性表运算15
算法2.2向量运算19
算法2.3向量的插入21
算法2.4向量的删除22
算法2.5集合并运算23
算法2.6集合交运算24
算法2.7约瑟夫问题25
算法2.8堆栈运算27
算法2.9后缀表达式计值31
算法2.10求和与阶乘的递归算法33
算法2.11汉诺塔问题的递归求解实现34
算法2.12阶乘的递归调用35
算法2.13队列的运算42
算法2.14优先级队列45
算法2.15事件驱动模拟49
算法3.1单链表结点及操作58
算法3.2单链表中的运算60
算法3.3用Nodelib中的函数实现单链表的建立和查找68
算法3.4基于单链表结构的操作方法实现单链表的建立和查找69
算法3.5链栈运算70
算法3.6链队列运算72
算法3.7打印缓冲池76
算法3.8模拟打印缓冲池的实现主函数78
算法3.9循环链表运算81
算法3.10双链表中的运算83算法4.1串运算90
算法4.2KMP匹配算法93
算法4.3计算next数组94
算法5.1直接插入排序101
算法5.2折半插入排序102
算法5.3Shell排序105
算法5.4直接选择排序106
算法5.5起泡排序108
算法5.6快速排序111
算法5.7基数排序115
算法5.8归并排序118
算法5.9一趟两组归并119
算法5.10两组归并119
算法6.1顺序查找126
算法6.2折半查找128
算法6.3线性探测法解决冲突135
算法6.4用双散列函数解决冲突136
算法7.1二叉树构建与遍历150
算法7.2使用栈的二叉树前序遍历151
算法7.3使用栈的二叉树对称序遍历152
算法7.4使用栈的二叉树后序遍历152
算法7.5对称序线索化二叉树154
算法7.6在对称序线索树中找指定结点的对称序后继155
算法7.7对称序遍历对称序线索化二叉树155
算法7.8在对称序线索化二叉树中插入一新结点156
算法8.1将p所指结点插入以q为根结点指针的二叉排序树中160
算法8.2构造二叉排序树161
算法8.3二叉排序树中结点的删除162
算法8.4构造Huffman树180
算法8.5大根堆185
算法9.1基于邻接表表示图的深度优先遍历算法207
算法9.2Prim算法211
算法9.3Dijkstra算法215
算法9.4Floyd算法求网络中任意两顶点间的最短路径217
算法9.5拓扑排序221
算法10.1整数划分227
算法10.2迷宫问题230
算法10.3n皇后问题233
算法10.4背包问题的分支限界法算法236
算法10.5求两字符串的最长公共子序列243