首页 > 图书中心 > 数据结构与算法(第3版)

目录

目录

第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键树和23树165

8.4.1键树165

8.4.223树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键树和23树175

8.4.1键树175

8.4.223树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键树和23树/175

8.4.1键树/175

8.4.223树/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二叉树的LeftChildRightChild表示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两棵不同形式的23树177

图8.2323树的插入177

图8.24在图8.22(b)中插入8后23树的变化图178

图8.2523树的删除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用01矩阵表示的迷宫230

图10.201背包问题的解空间树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

版权所有(C)2023 清华大学出版社有限公司 京ICP备10035462号 京公网安备11010802042911号

联系我们 | 网站地图 | 法律声明 | 友情链接 | 盗版举报 | 人才招聘