清华大学《数据结构》课程讲义第五讲
清华大学数据结构课件--树
三叉链表的静态结构
28
利用二叉链表的二叉树类定义(p194)
template <class T> struct BinTreeNode { //二叉树结点类定义 T data; //数据域 BinTreeNode<T> *leftChild, *rightChild; //左子女、右子女链域 BinTreeNode () //构造函数 { leftChild = NULL; rightChild = NULL; } BinTreeNode (T x, BinTreeNode<T> *l = NULL, BinTreeNode<T> *r = NULL) { data = x; leftChild = l; rightChild = r; } };
12
二叉树 (Binary Tree)
二叉树的定义 一棵二叉树是结点的一个有限集合,该集合 或者为空,或者是由一个根结点加上两棵分 别称为左子树和右子树的、互不相交的二叉 树组成(子树有左右之分,次序不能颠倒)
L
R
L
R
二叉树的五种不同形态
13
二叉树的性质
性质1 若二叉树结点的层次从 1 开始, 则在 二叉树的第 i 层最多有 2i-1 个结点。( i≥1) [证明用数学归纳法]
5
树的基本术语
子女:若结点的子树非空,结点子树的根即 为该结点的子女。 双亲:若结点有子女,该结点是子女双亲。
A
1层
D
H M I J
B
E K L F
C
G
2层
3层 4层
depth height =4 =4
6
数据结构教案(清华大学) ds
数据结构PPT教案(清华大学)DS 第一章:引言1.1 数据结构的概念数据结构的定义数据结构的应用场景数据结构的基本术语1.2 数据的抽象抽象数据类型(ADT)数据结构的表示数据结构的操作1.3 算法与数据结构的关系算法的定义算法与数据结构的关系算法分析与评估第二章:线性表2.1 线性表的定义线性表的概念线性表的抽象数据类型线性表的表示2.2 线性表的实现顺序存储结构链式存储结构线性表的扩充操作2.3 线性表的操作线性表的插入与删除线性表的查找与排序线性表的其他操作第三章:栈和队列3.1 栈的定义和应用栈的概念栈的抽象数据类型栈的表示和操作栈的应用场景3.2 队列的定义和应用队列的概念队列的抽象数据类型队列的表示和操作队列的应用场景3.3 栈和队列的扩展双向栈和双向队列栈和队列的链式存储结构栈和队列的其他操作第四章:线性表的排序4.1 排序的基本概念排序的定义排序的分类排序的评价指标4.2 插入排序直接插入排序希尔排序插入排序的性能分析4.3 选择排序简单选择排序堆排序选择排序的性能分析4.4 交换排序冒泡排序快速排序交换排序的性能分析第五章:查找5.1 查找的基本概念查找的定义查找的评价指标查找的方法分类5.2 顺序查找线性表的顺序查找有序表的顺序查找顺序查找的性能分析5.3 二分查找二分查找的原理二分查找的实现二分查找的性能分析5.4 哈希查找哈希查找的原理哈希函数的设计哈希查找的性能分析第六章:树和二叉树6.1 树的基本概念树的定义树的抽象数据类型树的基本术语树的性质6.2 二叉树二叉树的定义二叉树的基本性质二叉树的遍历二叉树的类型6.3 线索二叉树线索二叉树的概念线索二叉树的遍历线索二叉树的存储结构6.4 树的应用树的遍历算法树的构建与操作树的应用场景第七章:图7.1 图的基本概念图的定义图的抽象数据类型图的基本术语图的性质7.2 图的表示邻接矩阵邻接表邻接多重表7.3 图的遍历深度优先搜索(DFS)广度优先搜索(BFS)图的遍历应用7.4 图的路径与连通性最短路径问题最小树问题连通性判定第八章:树和图的算法8.1 树的结构操作树的创建与销毁树的插入与删除树的遍历与遍历算法的优化8.2 图的算法最小树算法最短路径算法连通性算法网络流与最大流算法8.3 应用实例编译原理中的抽象语法树数据库中的查询树中的决策树第九章:哈希表和字典树9.1 哈希表哈希表的概念哈希函数的设计哈希冲突的解决方法哈希表的性能分析9.2 字典树字典树的概念字典树的类型字典树的构建与查询字典树的应用9.3 布隆过滤器布隆过滤器的概念布隆过滤器的原理布隆过滤器的应用10.1 数据结构的重要性数据结构在计算机科学中的应用数据结构在软件工程中的重要性数据结构在算法设计中的作用10.2 数据结构的发展趋势新型数据结构的研究与发展数据结构与算法的融合数据结构在云计算与大数据中的应用10.3 课程回顾与拓展本门课程的重点与难点课程内容的拓展与延伸推荐的学习资料与研究文献重点和难点解析一、数据结构的概念和应用场景补充和说明:数据结构是计算机科学中的基础概念,理解数据结构对于编写高效、可维护的代码至关重要。
数据结构(清华大学课件)
float GetReal( cpmplex Z );
// 返回复数 Z 的实部值 float Getimag( cpmplex Z ); // 返回复数 Z 的虚部值
void add( complex z1, complex z2, complex &sum ); // 以 sum 返回两个复数 z1, z2 的和
―数据抽象” 和“数据封装”
数据抽象 用ADT描述程序处理的实体
时,强调的是其本质的特征、其所能 完成的功能以及它和外部用户的接口 (即外界使用它的方法)。
数据封装 将实体的外部特性和其内部
实现细节分离,并且对外部用户隐藏
其内部实现细节
抽象数据类型的描述方法
ADT =(D,S,P)
其中: D 是数据对象, S 是 D 上的关系集, P 是对 D 的基本操作集。
又如,在 2 行 3 列的二维数组中六个元素 {a1, a2, a3, a4, a5, a6} 之间存在着两个关系: ―行” 的次序关系:
row = {<a1,a2>,<a2,a3>,<a4,a5>,<a5,a6>}
a1 a2 a3 a4 a5 a6
―列” 的次序关系:
col = {<a1,a4>,<a2,a5>,<a3,a6>}
InitComplex(z1,8.0,6.0);
InitComplex(z2,4.0,3.0);
Add(z1,z2,z3);
Multiply(z1,z2,z4);
if (Division (z4,z3,z)) {
GetReal (z, RealPart);
GetImag (z, ImagPart);
数据结构教案清华大学
数据结构教案清华大学第一章:引言1.1 数据结构的概念介绍数据结构的基本概念和重要性理解数据结构在计算机科学中的应用1.2 数据的表示和操作学习数据的表示方法,如数组、链表、栈和队列等掌握基本的数据操作,如插入、删除、查找和排序等1.3 算法和算法分析理解算法的基本概念和设计方法学习算法分析的基本工具,如时间复杂度和空间复杂度分析第二章:线性表2.1 数组理解数组的基本概念和实现方法掌握数组的操作,如插入、删除和查找等2.2 链表学习链表的基本概念和实现方法掌握链表的操作,如插入、删除和查找等2.3 栈和队列理解栈和队列的基本概念和实现方法掌握栈和队列的操作,如入栈、出栈、入队和出队等第三章:非线性表3.1 树的基本概念学习树的基本概念,如节点、边和树的类型等理解树在数据结构中的重要性3.2 二叉树学习二叉树的基本概念和性质掌握二叉树的操作,如插入、删除和遍历等3.3 树的其他类型学习其他类型的树,如平衡树、红黑树和B树等理解不同类型树的特点和应用场景第四章:图4.1 图的基本概念学习图的基本概念,如节点、边和图的类型等理解图在数据结构中的应用4.2 图的表示和遍历学习图的表示方法,如邻接矩阵和邻接表等掌握图的遍历方法,如深度优先搜索和广度优先搜索等4.3 图的路径和最小树学习图的路径概念,如简单路径和最短路径等掌握最小树算法,如普里姆算法和克鲁斯卡尔算法等第五章:排序和查找5.1 排序的基本概念学习排序的基本概念和分类理解排序在数据结构中的应用5.2 常见排序算法学习常见的排序算法,如冒泡排序、选择排序和快速排序等掌握排序算法的实现和时间复杂度分析5.3 查找算法学习查找的基本概念和分类掌握常见的查找算法,如顺序查找和二分查找等理解查找算法在数据结构中的应用第六章:算法设计与分析6.1 算法设计策略学习贪心算法、分治算法、动态规划算法和回溯算法等设计策略理解不同设计策略的适用场景和特点6.2 算法效率分析学习算法效率分析的基本概念,如时间复杂度和空间复杂度掌握常见算法复杂度的计算和比较方法第七章:堆和优先队列7.1 堆的基本概念学习堆的基本概念,如最大堆和最小堆掌握堆的实现方法和操作,如插入、删除和调整等7.2 优先队列的实现学习优先队列的基本概念和实现方法掌握优先队列的操作,如插入、删除和获取最大(或最小)元素等第八章:串和文本处理8.1 串的基本概念学习串的基本概念,如字符串和文本等掌握串的表示和操作方法,如串的创建、复制和连接等8.2 串的模式匹配学习串的模式匹配算法,如朴素模式匹配和KMP模式匹配等掌握模式匹配在文本处理中的应用,如文本搜索和替换等第九章:哈希表和开放地址哈希9.1 哈希表的基本概念学习哈希表的基本概念和实现方法掌握哈希表的操作,如插入、删除和查找等9.2 开放地址哈希学习开放地址哈希的基本概念和实现方法掌握开放地址哈希的处理冲突的方法和算法优化技巧第十章:总结与实践10.1 数据结构的应用场景回顾本课程学习的内容,了解不同数据结构在实际应用场景中的应用学习如何根据实际问题选择合适的数据结构和算法10.2 实践项目完成一个综合性的实践项目,运用所学知识和技能解决实际问题培养动手能力和实际应用能力,巩固对数据结构的理解和掌握重点和难点解析重点一:数据结构的基本概念和重要性数据结构是计算机科学中的基础,它涉及到数据的组织和存储方式,对程序的效率和可读性有很大影响。
清华大学算法课5
2
一维数组的特点: 1个下标,ai 是ai+1的直接前驱
2个下标,每个元素ai,j受到两个关系 二维数组的特点: (行关系和列关系)的约束: a11 a12 … a1n a21 a22 … a2n 一个m×n的二维数组可以 Amn= … … … … 看成是m行的一维数组,或 am1 am2 … amn 者n列的一维数组。
M=
T=
稀疏矩阵M和T
19
ADT SqarseMatrix{ 数据对象:D={aij |i=1,2…,m;j=1,2,…,n; aij ElemSet,m和n为行 数和列数 数据关系:R={Row,Col} Row={<ai,j,ai,j+1>|1<=i<=m,1<=j<=n-1} Col={<ai,j,ai+1,j>|1<=i<=m-1,1<=j<=n} 基本操作: createSMatrix(); 操作结果:创建稀疏矩阵。 destroFSMatrix(); 初始条件:稀疏矩阵存在。 操作结果:销毁稀疏矩阵
第5章 数组和广义表(Arrays & Lists)
数组和广义表的特点:一种特殊的线性表
① 元素的值并非原子类型,可以再分解,表中元素
也是一个线性表(即广义的线性表)。 ② 所有数据元素仍属同一数据类型。
5.1 5.2 5.3 5.4 5.5
数组的定义 数组的顺序表示和实现 矩阵的压缩存储 广义表的定义 广义表的存储结构
对称矩阵
14
5.3.1特殊矩阵
对称矩阵的存储方式
在对称矩阵中,第i行恰有i+1个元素,元素总数为: (i+1)=n(n+1)/2。可以将这些元素存放在一个向量 sa[0..n(n+1)/2-1]中 为了便于访问对称矩阵A中的元素,我们必须在aij和sa[k]之 间找一个对应关系。 若i≧j,则aij在下三角形中。 aij之前的i行(从第0行到第 i-1行)一共有1+2+…+i=i(i+1)/2个元素,在第i行上,aij之 前恰有j个元素(即ai0,ai1,ai2,…,aij-1),因此有: k=i*(i+1)/2+j 0≦k<n(n+1)/2 若i<j,则aij是在上三角矩阵中。因为aij=aji,所以只要交换 上述对应关系式中的i和j即可得到: k=j*(j+1)/2+i 0≦ k<n(n+1)/2
61清华大学《数据结构》课程讲义第五讲PPT课件
建堆起点(数组下标起止)
树根r在数组 内的下标是0
a0
下一个子r递堆减起点
就是它的兄弟
子树根r的右
子树根r孩的子左下标 叶孩子子下下标标范围
a1
a3
n是节点总数
n 2
1
a4
a5
a2 起点
起点 a6
a7
a8 a9
a10 a11
a12 a13
int ttoottaall;
int grade;
char num[20];
stuGRADE AAA[[12[0390]]];
int SUBtotal;
char name[20];
struct node *left,*right;
student B[20];
};
};
};
大作业(三)--参考作业评判
数据结构
2012.2
课程大纲
第1讲 数据结构—应用、概念、以及课程基础 第2讲 线性表--链表、队列 第3讲 堆栈、非线性数据结构-二叉树 第4讲 二叉树、堆 第5讲 堆、哈夫曼树 第6讲 检索操作 第7讲 分块检索与哈希表 第8讲 排序 第9讲 算法分析与图的基本概念 第10讲 图结构 第11讲 图应用 第12讲 高级数据结构内容--索引技术
得庞大;
2. 平衡处理的很好。
3. 层次遍历不错,这次删除了线索化 二叉树的内容,有条件的同学可以 自己做。
4. 统计界面不错。
十字链参考
堆结构 局部有序:有序关系仅限定在
父亲与孩子之间,任何一个节 点与其兄弟之间的关键码值大
a1
小都没有必然的联系
一堆元素有顺序 的聚集在一起
数据结构教案清华大学
数据结构教案清华大学第一章:引言1.1 数据结构的概念数据结构的定义数据的两种类型:标量数据和向量数据数据结构的基本概念1.2 数据结构的应用排序和搜索算法栈和队列的应用链表的应用图的应用1.3 数据结构的设计线性数据结构非线性数据结构树和森林图的表示和遍历第二章:线性表2.1 线性表的概念线性表的定义线性表的性质线性表的抽象数据类型2.2 线性表的实现顺序存储结构链式存储结构线性表的顺序存储实现线性表的链式存储实现2.3 线性表的操作线性表的插入和删除操作线性表的查找和排序操作线性表的逆序输出第三章:栈和队列3.1 栈的概念栈的定义栈的性质栈的抽象数据类型3.2 栈的实现顺序栈的实现链式栈的实现栈的操作实现3.3 队列的概念队列的定义队列的性质队列的抽象数据类型3.4 队列的实现顺序队列的实现链式队列的实现队列的操作实现第四章:串4.1 串的概念串的定义串的性质串的抽象数据类型4.2 串的实现串的顺序存储实现串的链式存储实现串的操作实现4.3 串的模式匹配朴素的模式匹配算法KMP模式匹配算法BM模式匹配算法第五章:数组和稀疏矩阵5.1 数组的概念数组的定义数组的性质数组的抽象数据类型5.2 数组的实现数组的顺序存储实现数组的链式存储实现数组的操作实现5.3 稀疏矩阵的概念稀疏矩阵的定义稀疏矩阵的性质稀疏矩阵的抽象数据类型5.4 稀疏矩阵的实现稀疏矩阵的压缩存储实现稀疏矩阵的运算实现稀疏矩阵的逆矩阵计算这五个章节涵盖了数据结构的基本概念、线性表、栈和队列、串、数组和稀疏矩阵等内容,为学生提供了数据结构的基础知识。
希望这些教案能够帮助学生理解数据结构的重要性和应用,并能够熟练地运用相关算法解决问题。
第六章:树和二叉树6.1 树的概念树的基本概念树的性质树的抽象数据类型6.2 二叉树的概念二叉树的定义二叉树的性质二叉树的抽象数据类型6.3 二叉树的遍历前序遍历中序遍历后序遍历层序遍历6.4 线索二叉树线索二叉树的概念线索二叉树的操作线索二叉树的遍历第七章:图7.1 图的概念图的定义图的性质图的抽象数据类型7.2 图的表示邻接矩阵邻接表逆邻接表7.3 图的遍历深度优先搜索广度优先搜索最短路径算法7.4 最小树最小树的定义普里姆算法克鲁斯卡尔算法第八章:排序算法8.1 排序的概念排序的定义排序的性质排序的抽象数据类型8.2 内部排序算法冒泡排序选择排序插入排序快速排序归并排序堆排序8.3 外部排序算法外部排序的概念外部排序的策略外部排序的算法实现第九章:查找算法9.1 查找的概念查找的定义查找的性质查找的抽象数据类型9.2 内部查找算法顺序查找二分查找分块查找9.3 哈希查找哈希的概念哈希函数的设计哈希查找的实现9.4 索引查找索引的概念索引的实现索引查找的算法实现第十章:动态规划10.1 动态规划的概念动态规划的定义动态规划的性质动态规划的抽象数据类型10.2 动态规划的应用背包问题最长公共子序列最短路径问题股票买卖问题10.3 动态规划的算法实现动态规划算法的框架动态规划算法的实现技巧动态规划算法的优化重点和难点解析一、线性表的实现线性表的顺序存储实现:如何合理地分配数组的大小,以及如何进行数据的插入和删除操作。
【计算机专业考研必备】殷仁昆_数据结构考研-要点解析(清华大学殷仁昆教授数据结构辅导班讲义)
3) 注意练习
只看书不做题,不能真正学会有关知识, 不能达到技能培养的目的。 做题是自我检查的重要手段。 在做算法设计类型的习题时,应考虑数据 结构的定义。 3. 提高算法设计的能力。
编写算法的题可能是学生比较棘手的问题,特 别是在考试这样一个氛围,时间又短促,想编 出一个好算法不太容易。
问题2. 当元素以A, B, C, D, E顺序进栈,D, B, C, E, A 是可能的出栈顺序吗?
解析:“否”,因序列的进出栈顺序为 IA IB IC ID OD, 当D 出栈后,栈顶为C,不能让B先出来。 所以D, B, C, E, A 不是可能的出栈顺序。
26
问题3. 可否用两个栈模拟一个队列?反过来呢? 解析:“可以”,一个栈把全部数据反过来,另一 个栈再把这些数据反过去即可。而队列不能。 问题4. 栈、队列对线性表加了什么限制?
9
复习的范围
根据2009年考试分析和历年考试经验,可以对今 后考试作一个简单评估:
单项选择题覆盖了考试大纲涉及的所有各章, 主要考查对各个数据结构的定义和特点的理解, 以及相应延伸的概念。
综合应用题分为两个部分:算法分析题和算法 设计题(编程题),主要考查分析问题和解决 问题的能力。算法分析题的重点在图、查找、 排序部分,算法设计题的重点在线性表、树与 二叉树、查找和排序部分。
16
第一章知识点解析
本章“线性表”的知识点有 5 个: 1) 线性表的定义和特点:由数据元素组成,惟一 直接前驱与后继。 2) 线性表的基本操作:查找、定位、遍历、插入、 删除。 3) 线性表的存储表示:顺序存储、链表存储。 4) 循环链表和双向链表:定义和基本运算。
5) 线性表的应用:掌握使用线性表基本操作实现 应用算法
清华大学课程讲义-数据结构答案
1-4.什么是抽象数据类型?试用C++的类声明定义“复数”的抽象数据类型。
要求(1) 在复数内部用浮点数定义它的实部和虚部。
(2) 实现3个构造函数:缺省的构造函数没有参数;第二个构造函数将双精度浮点数赋给复数的实部,虚部置为0;第三个构造函数将两个双精度浮点数分别赋给复数的实部和虚部。
(3) 定义获取和修改复数的实部和虚部,以及+、-、*、/等运算的成员函数。
(4) 定义重载的流函数来输出一个复数。
【解答】抽象数据类型通常是指由用户定义,用以表示应用问题的数据模型。
抽象数据类型由基本的数据类型构成,并包括一组相关的服务。
//在头文件complex.h中定义的复数类#ifndef _complex_h_#define _complex_h_#include <iostream.h>class comlex {public:complex ( ){Re = Im = 0; }//不带参数的构造函数complex ( double r ) {Re = r;Im = 0; }//只置实部的构造函数complex ( double r, double i ) {Re = r;Im = i; }//分别置实部、虚部的构造函数double getReal ( ) { return Re; }//取复数实部double getImag ( ) { return Im; }//取复数虚部void setReal ( double r ) {Re = r; }//修改复数实部void setImag ( double i ) { Im = i; } //修改复数虚部complex& operator = ( complex&ob) {Re = ob.Re;Im = ob.Im; }//复数赋值complex& operator + ( complex&ob );//重载函数:复数四则运算complex& operator– ( complex&ob );complex& operator * ( complex&ob );complex& operator / ( complex&ob );friend ostream& operator << ( ostream&os, complex&c );//友元函数:重载<<private:double Re, Im;//复数的实部与虚部};#endif//复数类complex的相关服务的实现放在C++源文件complex.cpp中#include <iostream.h>#include <math.h>#include“complex.h”complex&complex:: operator + ( complex &ob ) {//重载函数:复数加法运算。
清华大学数据结构讲义
态度意识
• 北京:享受生活,求新, 关注社会
• 上海:个人化,倾向于保 持现状
Attitude 会花钱比多挣钱更重要 即使再忙,我也要抽时间参加锻炼 我很关注暴力与犯罪的问题 我往往是最早购买最新技术产品的人 我经常去西式快餐店用餐 我喜欢追求富有挑战、新奇和变化的生活
Index
Attitude
Index
基本特征: 人口变量
和住房
100% 80% 60% 40% 20% 0%
100%
北京
上海
80%
60%
40%
20%
0%
5
北京
上海
CMMS数据
(15-64岁)
广州
大专/大学以上 初高中/中专/技校 小学及以下
沈阳
武汉
西安
大专及以上
初高中
北京
上海
人口普查数据
(6岁以上人口)
小学及以下
人口普查数据摘自《中国 人口统计年鉴2002》为 2000年人口普查结果
年末总人口(万人)
127627 1383 1641 994
689
758
695
人均国民生产总值(元) 7543 20581 30174 38007 17938 17776 10094
城镇居民平均每人每年可 支配收入(元)
6860
11578 12883 14694
6386
7305
6705
城镇居民平均每人每年消 费性支出(元)
50.86
平均每户 住房面积 (平方米)
48.31
51.49
58.22
64.32
55.64
住房 拥有 类型
北京
上海
清华大学-数据结构
int utype; GenListNode * tlink;
union {
int ref;
//utype = 0,表头结点
int intgrinfo;
//utype = 1, 整型char ch Nhomakorabearinfo;
//utype = 2, 字符型
GenListNode *hlink; //utype = 3,子表结点
} value;
public:
GenListNode &Info ( GenListNode *elem );
int nodetype ( GenListNode *elem )
{ return elem→utype; }
打印数组A[n]的值
void recfunc ( int A[ ], int n ) { if ( n >= 0 ) {
cout << A[n] << " "; n--;
recfunc ( A, n ); } }
void iterfunc ( int A[ ], int n ) { //消除了尾递归的非递归函数
if ( CurrentPos == EXIT ) { //出口处理
cout << CurrentPos << " "; return 1;
}
else
//递归向左搜寻可行
if (TraverseMaze(intsec[CurrentPos].left ))
{ cout << CurrentPos << “ ”; return 1; }
数据结构-清华大学-殷人昆-05
138-28
对于带权图还需设置一个存放与该边相关的权 值的域 cost。
顶点结点的结构
data Firstout
向的。
138-3
有向图与无向图 在有向图中,顶点对 <x, y> 是 有序的。在无向图中,顶点对(x, y)是无序的。
完全图 若有 n 个顶点的无向图有 n(n-1)/2 条边, 则此图为完全无向图。有 n 个顶点的有向图有 n(n-1) 条边, 则此图为完全有向图。
0
0
00
1
121 2
1
//最大顶点个数
typedef char VType;
//顶点数据类型
typedef int WType;
//边上权值类型
typedef struct {
//静态存储定义
VType verticesList[maxVertices]; //顶点表
WType Edge[maxVertices][maxVertices];
138-8
图的存储表示
邻接矩阵 (Adjacency Matrix)
在图的邻接矩阵表示中,有一个记录各个顶点信 息的顶点表,还有一个表示各个顶点之间关系的 邻接矩阵。
设图 A = (V, E)是一个有 n 个顶点的图, 图的邻接 矩阵是一个二维数组 A.edge[n][n],定义:
A.Edge[
if ( v != -1 ) { for ( int col = 0; col < G.numVertices; col++ ) if ( G.Edge[v][col] > 0 && G.Edge[v][col] < maxValue ) return col; //顺序检测第 v 行寻找第一个邻接顶点 //对于无权图,maxValue应为INT_MAX
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树的路径与检索效率
while if loop repleat if loop 输入检索序列:for
if 1
比较次数
if
比较次数 1
h=4
for 2
while
2 3 repeat
for
2
repeat h=3
2
loop 3
3 while
4 loop
平均比较次数=(1+2+2+3+3)/5 平均比较次数=(1+2+2+3+4)/5
a8
a9
a10 a11
a12
a13
a14
非最佳二叉排序树,级数前 n项中某些项的权值变大 二叉树的路径变大
0,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5 i=1 i=2 i=3
PL > ∑ log 2 j
j =1
n
i=4
i=5 i=6
树的深度增大
若检索概率相等,则最佳二叉排序树具有最短路径
非线性数据结构--二叉树 堆结构
堆的定义 建堆方法 • 最大堆建堆方法 • 建堆的起点 • 建堆程序 • 把元素插入到一个堆中 堆应用
Hale Waihona Puke 1.大作业(三)--二叉排序成绩树节点设计 成绩段的分数分布不规律
成绩段: <50,50-59,60-64, 65-69,70-74,75-79,80-84,85-89,90-94,95-100 E, D, C, C+, B-, B, B+, A, AA, AA+ 2. 节点结构由数据域与两指域组成的链式存储结构,数据域由分数(int)、学 号、姓名组成,设有相同分数的学生人数小于20。 一棵成绩树 3. 特点 请各位同学自己 遍历一个成绩段的学生分数 成绩段内的学生数,初始化=0。 怎样设计节点结构? 分数初始化=-1 成绩段内的分数分布,如节点:A[0]对应成绩是50 有相同分数的学生数 相同分数的学生信息 设计节点,这里 分的学生信息,A[1]对应成绩是51分的学生信息。 一个成绩段内有多个同学; 仅供参考。 多个同学有相同的分数; 0 1 2 3 4 5 6 7 8 9
继续在数组末端增加一个元素,等于在 它是最右 继续在数组末端增加一个元素,等于在 当前完全二叉树最右端又插入一叶子 当前完全二叉树最右端又插入一叶子 端的叶子
把元素插入到堆中
int insertMAXheap(struct node array[],struct node x,int &rn) { 检查数组空间 堆数组 int i,j; 堆元素个数+1 堆元素个数+1 if(rn==M)return(-1); rn++;i=rn;j=i/2-1; 设置父节点位置 新元素 堆元素个数
数据结构
2012.2
课程大纲
第1讲 第2讲 第3讲 第4讲 第5讲 第6讲 第7讲 第8讲 第9讲 第10讲 第11讲 第12讲 数据结构—应用、概念、以及课程基础 线性表--链表、队列 堆栈、非线性数据结构-二叉树 二叉树、堆 堆、哈夫曼树 检索操作 分块检索与哈希表 排序 算法分析与图的基本概念 图结构 图应用 高级数据结构内容--索引技术
12
15
17
10
6
3
7
16
11
8
9
1
最小堆结构类似
最大值建堆方法(1)
一棵完全二叉树已经存储在数组内
需要9次交换 (4,2) (4,1) (2,1)
关键码值 4>1,交换 继续和父节点比较 1
(5,2) (5,4) (6,3)
1<2,交换 (6,5) 2 顶点下沉 (7,5) 4>2,交换 4 5 (7,6) 6 7 3
取出堆顶 输入数组
通过建堆,可以得到一个序列的最大值在顶点(数组[0]位置) 45 23 53 12 24 90 78 建堆 90 24 78 12 23 53 45 取出堆顶 建堆 78 45 53 12 24 23 取出堆顶 建堆 53 45 12 23 24 取出堆顶 建堆 45 23 24 12 取出堆顶 建堆 24 12 23 取出堆顶 建堆 23 12 自然堆
新节点是插入到一棵顺序存储的 完全二叉树的叶子 在堆中寻找新节点 的正确位置
12
k 2 −1
一棵完全二叉树, 也是一个最大堆
11
9
i −1 k 它的父节点 2 数组下标 =序号-1 j 6 10
j 2 −1
7
1
8
4
2
11 5
12 3
i 19
十字链参考
堆结构
局部有序:有序关系仅限定在 父亲与孩子之间,任何一个节 点与其兄弟之间的关键码值大 小都没有必然的联系 a1 一堆元素有顺序 的聚集在一起 整体看是堆形状 结构上看,是一 棵完全二叉树 a2 堆是一棵用顺序存储 实现的完全二叉树 a3
a4
a5
a6
a7
a8
a9
a10
a11
a12
a13
n <= 叶子 < n 2
L _ child (r ) = 2r + 1,
2r + 1 < n
<n
数组下标
建堆程序
未 建堆起点达树根则递减 数组[0] 未达树根则递减 数组[0] 堆元素个数 建立子堆 void buildheap(struct node *heap,int n) {int i;for(i=n/2-1;i>=0;i--)siftdown(heap,n,i);} 取较大孩子 取较大孩子 的关键码 子堆程序 void siftdown(struct node *heap,int n,int pos) {int j; 检查边界 达到叶子则终止下沉处理 assert((pos>=0)&&(pos<n)); while(!isleaf(pos,n)){ return((pos>=n/2)&&(pos<n)); j=leftchild(pos,n); 取其左孩子位置 符合堆则 if((j<(n-1))&&(heap[j].key<heap[j+1].key))j++; 查找pos是否 返回 if(heap[pos].key>=heap[j].key)return; 符合最大堆 swap(&heap[pos],&heap[j]);pos=j;} 3 } 下沉 否则父亲与较大关键码孩子交换位置
方法1:从底层最左边叶子节点开始,逐层比较每一节点与其父节点的值; A、若子节点值大,则父子位置交换; B、逐层向上比较直至根节点; C、再从这个叶子节点的兄弟开始,继续A、B过程。
从最小(倒数第二层)最右子树根开始建堆,然后对左端邻居逐一建堆(同层子 新的R,它在数组内的位置 树的根),直至树根(数组下标0) 建堆起点是最右 是它孩子的左邻 1 下一个子堆R是当 边一棵子树根
对一个数组循 环建最大堆, 其堆顶构成的 新序列递增有 序
树结构分类
后续内容
树形结构分类 判定树 排序
维持平衡的树结构 非线性数据 结构基础
支撑树 图
树的应 用领域
检索树(索引) B+树 2-3树
树
二叉树 Huffman树 堆
高级树 PR四分树 k-d树
排序二叉树 B树 线索二叉树
trie树结构 伸展树 AVL树
最佳二叉检索树
0 a0 第i层节点的路径L=i-1 1 a1 2 a3 3 a7 a4 a5 a6
第i层节点的路径总长PL(i)= 完全二叉树:Li=(i-1)·2i-1 Li×第i层上节点总数 ≤(i-1)·2i-1 所以路径为k的节点至多有2k个
a2
a8
a9
a10
a11
a12
a13
因最佳二叉排序树每层的PLi=(i-1)·2i-1,其路径长度是下面展开级数的前n项和:
大作业(三)--参考作业评判
一、功能区设计 1. 总体不错; 2. 程序设计细节欠缺,比如插入操作,点击后弹出对话框,必须再次用 鼠标点击复选框后,才能输入。 二、图形界面 数据结构大作业三范例(2008011577) 1. 总体不错; 2. 节点不能拖动,缺乏树形状界面调整,反映出不熟悉应用软件风格; 三、对作业理解 1. 2. 3. 4. 没有用成绩段作为节点,而是以学号(人)为节点,因此节点数会变 得庞大; 平衡处理的很好。 层次遍历不错,这次删除了线索化 二叉树的内容,有条件的同学可以 自己做。 统计界面不错。
第五讲 堆、哈夫曼树
关于数据结构大作业(三)
参考作业评判
非线性数据结构--二叉树 哈夫曼树
树结构分类 等概率检索的最佳二叉树 • 树的路径与检索效率 • 等概率下的最佳检索树 非等概率检索的最佳二叉树 • 哈夫曼树 • 哈夫曼树算法 • 程序设计方法 • 程序结构 哈夫曼树应用举例 • 哈夫曼编码树 • 序列的归并顺序
while(A[i].grade>=0)for(int j=0;j<SUBtotal;j++){cout<<A[i].B[j].num<<endl; i++} struct node { struct student { struct stuGRADE { int total; char num[20]; total int grade; char name[20]; stuGRADE A[10]; A[2 A[1 ] ] A[0 A[9 A[3 int SUBtotal; struct node *left,*right; }; student B[20]; }; };