南京大学数据结构(商琳)Chapter5

合集下载

5数据结构第5章

5数据结构第5章

5数据结构第5章在计算机科学的领域中,数据结构就像是构建高楼大厦的基石,为程序的高效运行提供了坚实的支撑。

而我们今天要深入探讨的,正是这其中的第五章所涵盖的重要内容。

第五章通常聚焦于某种特定的数据结构,或许是树,也许是图。

以树为例,它是一种分层的数据结构,就如同真实世界中的家族树一样,有着明确的层次和关系。

在这一章中,我们首先会了解到二叉树。

二叉树是树结构中最为基础和重要的一种形式。

它的每个节点最多只有两个子节点,分别称为左子节点和右子节点。

这种简单而又规整的结构,使得在进行数据存储和操作时,具备了很多独特的优势。

比如,在查找数据时,二叉搜索树能够通过比较节点的值,快速地定位到目标数据。

如果要查找的值小于当前节点的值,就向左子树继续查找;反之,则向右子树查找。

这种二分查找的思想,大大提高了查找的效率。

除了二叉树,堆也是第五章中常常会涉及的内容。

堆分为最大堆和最小堆。

最大堆中,每个节点的值都大于或等于其子节点的值;而最小堆则正好相反,每个节点的值都小于或等于其子节点的值。

堆在很多场景中都有着重要的应用。

比如在优先队列中,我们可以使用堆来快速获取最高优先级的元素。

在排序算法中,堆排序就是基于堆这种数据结构实现的。

另外,平衡二叉树也是一个关键的知识点。

为了避免二叉树在插入和删除操作时出现严重的不平衡,影响性能,平衡二叉树通过一系列的调整策略,始终保持着相对平衡的状态。

常见的平衡二叉树算法有AVL 树和红黑树。

AVL 树在每次插入或删除节点后,通过计算节点的平衡因子,来判断是否需要进行旋转操作以保持平衡。

而红黑树则通过其独特的颜色规则和调整策略,实现了高效的平衡维护。

在实际的编程应用中,理解和掌握这些数据结构至关重要。

比如在文件系统中,目录结构可以用树来表示,方便快速查找和管理文件。

在网络路由算法中,图结构可以用来描述网络节点之间的连接关系,从而找到最优的路径。

在学习这一章的过程中,可能会遇到一些挑战。

南京大学《数据结构》期末试卷(含答案)

南京大学《数据结构》期末试卷(含答案)

考试科目名称 数据结构〔A1 卷〕1、填空题。

〔每题 2 分,此题总分值 20 分〕 (1) C++语言中,数组是按行优先顺序存储的,假设定义了一个二维数组 A[20][30],每个元素占两个字节,其起始地址为 2140,那么二维数组 A 的最后一个数据元素的地址为 2140+2*(30*20-1) = 3338(3338,3339) 。

(2) 假设 A ,B 是两个单链表,链表长度分别为 n 和 m ,其元素值递增有序,将 A 和 B 归并成一个按元素值递增有序的单链表,并要求辅助空间为 O(1),那么实现该功能的算法的时间复杂度为 O(m+n)。

(3) 快速排序的平均时间复杂度是n*lg n。

(4) 假设有一个包含 9 个元素的最小堆,存放在数组 A 中,那么一定比 A[3]大的元素有__2 (A[7],A[8]) 个;一定比 A[3]小的元素有 2 (A[0],A[1])个。

〔元素从第 0 个位置开始存放〕(5) 广义表(((A)),(B,C), D, ((A), ((E,F)))) 的长度是4,深度是 4。

(6) 有 10 个元素的有序表,采用折半查找,需要比拟 4 次才可找到的元素个数为3。

(7〕当两个栈共享一存储区时,栈利用一维数组 A[n]表示,两栈顶指针为 top[0]与 top[1],那么栈满时的判断条件为top[0]+1=top[1]_ 或者 top[0] = top[1]+1。

(8) 假设计算斐波那契数的函数 Fib(long n)定义如下:long Fib(long n){if(n<=1) return n;else return Fib(n-1)+Fib(n-2)}计算 Fib(5)时的递归调用树〔即指明函数调用关系的树〕的高度是 4 子结点所在的高度为 0。

假设叶(9)(10) 假设用子女—兄弟链表方式表示森林,对应的二叉树的根结点是 p ,那么森林的第三棵树的根结点在二叉树中对应的结点是: p->rightchild->rightchild。

数据结构课件第5章-PPT文档资料

数据结构课件第5章-PPT文档资料
(a) 非紧缩方式; (b) 紧缩方式
第5章 串
5.2.2
和线性表的链式存储结构相类似,串的存储结构也可采用链 式存储结构,即用线性链表来存储串值。在这种存储结构下,存 储空间被分成一系列大小相同的结点,每个结点用data域存放字 符, link域存放指向下一个结点的指针。 这样, 一个串就可以用 一个线性链表来表示。
private { private declaration }
public { public declaration }
end;
第5章 串
这一段程序可看作一个字符串:“type private
Tstring = class
{private declaration } public {public declaration } end;
”, 其中“ ”表示换行符。Delphi的源程序编辑器提供了字符 串的查找与替换功能。 选择“Search”菜单中的“Replace”项, 在对话框中输入要查找字符串‘private’及替代串‘protected’, 如 图 5.1 所 示 , 则 执 行 命 令 后 以 上 程 序 中 的 关 键 字 ‘ private’ 被 ‘protected’替代。
第5章 串 串中任意个连续的字符组成的子序列称为该串的子串。包含 子串的串称为主串。通常称字符在序列中的序号为该字符在串中 的位置。子串在主串中的位置可以用子串的第一个字符在主串中 的位置来表示。
例如, 假设a、 b、 c、 d为如下的四个串:
a =‘Data’
b =‘Structure’
c =‘Data Structure’ d =‘Data Structure’
const maxlen = 允许的串最大长度;

《数据结构》课件第5章

《数据结构》课件第5章

串的链式存储结构对某些串操作,如联接操作等有 一定方便之处,但总的来说,不如顺序存储结构灵活, 它占用存储量大而且操作较复杂。
图5.3是每个结点存放一个字符的串的单链表示意图, 图5.4是每个结点存放4个字符的串的单链表示意图。一个 结点存储多个字符的链式结构也称为块链结构。
图5.3 串的链式存储结构中每个结点存放1个字符
串T1的长度等于MAXSIZE,则两串联接得到的S串 实际上只是串T1的拷贝,串T2全部被截断,S串的长度 等于MAXSIZE。用C语言实现的具体算法如下: SeqString concat(SeqString t1,SeqString t2) /*由串t1和串t2联接而成的新串存放在串s中,以返回值 形式带回。若长度超过规定的长度,则截断*/ {
5.1 串的定义及基本操作
串(String)是由零个或多个字符组成的有限序列。一 般记为
S = "a1 a2 …an" (n≥0) 其中,S是串名,用单引号或双引号括起来的字符序 列是串的值,ai(1≤i≤n)可以是字母、数字或其它字符。串 中字符的数目n称为串的长度,长度为0的串称为空串。 串中任意个连续的字符组成的子序列称为该串的子串, 包含子串的串相应地称为主串。通常把字符在序列中的 序号称为该字符在串中的位置,子串在主串中的位置则 以子串的第一个字符在主串中的位置来表示。空串是任 意串的子串,任意串是其自身的子串。
(2) 非紧凑格式,即每个存储单元仅存放一个字符。 这种存储方式的空间利用率很低,但操作时不需要分离字 符,因而程序处理字符的速度比较快。如图5.2所示,存放 给定的串C="datastructure"则需要15个存储单元。
图5.1 串值的紧凑格式存储
图5.2 串值的非紧凑格式存储

南京大学数据结构(商琳)Chapter6

南京大学数据结构(商琳)Chapter6
int operator == ( SetList<Type>& right ); //判集合this与集合right相等
int Min (Type&); //返回集合最小元素值 int Max (Type&); //返回集合最大元素值}
template <class Type> SetList<Type> SetList<Type> :: operator + ( SetList<Type>& right ) { //求集合this与集合right的并
private:
SetNode<Type> *first, *last;
public: SetList ( )
//构造函数
{ first = last = new SetNode<Type>; }
SetList ( SetList<Type>& right );
~SetList ( ) { MakeEmpty( ); delete first; } void MakeEmpty ( ); //置空集合
assert ( bitVector != NULL ); for ( int i = 0; i < MaxSize; i++ ) //置空集合
bitVector[i] = 0;
}
int Set :: Addmember ( const int x ) { if ( x >= 0 && x < MaxSize ) { bitVector[x] = 1; return 1; } return 0;
} pc->link = NULL; st = pc; //链表收尾 return temp;

(NEW)南京大学《842数据结构、软件工程、操作系统和计算机网络》历年考研真题汇编

(NEW)南京大学《842数据结构、软件工程、操作系统和计算机网络》历年考研真题汇编
件工程部分)
2007年南京大学软件基础一考研 真题(操作系统、数据结构部
分)
2007年南京大学软件基础三考研 真题(操作系统、数据结构部
分)
2008年南京大学软件基础一考研 真题(含操作系统、数据结构部
分)
2008年南京大学软件基础二考研 真题(操作系统、数据结构部
二、算法题 1 长度为n的数组a[0…n-1],编写一个算法在O(n)的时间复杂
度内将数组中所有负数放在非负数前面。
2 已知first为不带表头结点的单链表的表头指针(如下图所 示),链表中存储的都是整型数据,试写出求所有结点的data域平均值 的递归函数。(软院05年数据结构期末题)
3 假设以数组Q[m]存放循环队列中的元素,同时以rear和length分 别指示环形队列中的队尾位置和队列中所含元素的个数,试用C++语 言写出一个程序,给出该循环队列的类声明,给出队空条件和队满条 件,并写出相应的插入元素(Add)和删除(Delete)元素的算法(用 类模板,函数模板形式写)(软院04年考研原题)
目 录
1996年南京大学计算机考研真题(操作系统、数据结构部分) 1997年南京大学计算机考研真题(操作系统、数据结构部分) 1998年南京大学计算机考研真题(操作系统、数据结构部分) 1999年南京大学计算机考研真题(操作系统、数据结构部分) 2000年南京大学计算机考研真题(操作系统、数据结构部分) 2001年南京大学计算机考研真题(操作系统、数据结构部分) 2002年南京大学计算机考研真题(操作系统、数据结构部分) 2003年南京大学计算机考研真题(操作系统、数据结构部分) 2004年南京大学软件基础一考研真题(操作系统、数据结构部分) 2004年南京大学软件基础三考研真题(操作系统、数据结构部分) 2005年南京大学软件基础一考研真题(操作系统、数据结构部分) 2005年南京大学软件基础二考研真题(操作系统、数据结构部分) 2006年南京大学软件基础一考研真题(操作系统、数据结构、软件工程 部分) 2007年南京大学软件基础一考研真题(操作系统、数据结构部分) 2007年南京大学软件基础三考研真题(操作系统、数据结构部分)

南京大学数据结构(商琳)Chapter3

南京大学数据结构(商琳)Chapter3

Department of Computer Science & Technology, Nanjing University
fall
双栈共享一个栈空间
0
V
b[0]
t[0] t[1]
DATA STRUCTURES
maxSize-1 b[1]
初始 t[0] = b[0] = -1
t[1] = b[1] = ?maxSize
x = elements[top--];
return true;
//退栈成功
};
template <class T> bool Seqstack<T>::getTop(T& x) { //若栈不空则函数返回该栈栈顶元素的地址
if (IsEmpty() == true) return false; x = elements[top]; return true; };
int IsEmpty ( ) const; //判栈空否
int IsFull ( ) const;
//判栈满否
}
Department of Computer Science & Technology, Nanjing University
fall
栈的数组存储表示 — 顺序栈
DATA STRUCTURES
void Push(E x);
//进栈
bool Pop(E& x);
//退栈
Department of Computer Science & Technology, Nanjing University
fall
DATA STRUCTURES
bool getTop(E& x) const;

数据结构课后习题及解析第五章

数据结构课后习题及解析第五章

第五章习题5.1 假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。

已知A的基地址为1000,计算:数组A共占用多少字节;数组A的最后一个元素的地址;按行存储时元素A36的地址;按列存储时元素A36的地址;5.2 设有三对角矩阵An×n ,将其三条对角线上的元素逐行地存于数组B(1:3n-2)中,使得B[k]= aij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i,j的下标变换公式。

5.3假设稀疏矩阵A和B均以三元组表作为存储结构。

试写出矩阵相加的算法,另设三元组表C存放结果矩阵。

5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。

5.5写一个在十字链表中删除非零元素aij的算法。

5.6画出下面广义表的两种存储结构图示:((((a), b)), ((( ), d), (e, f)))5.7求下列广义表运算的结果:(1)HEAD[((a,b),(c,d))];(2)TAIL[((a,b),(c,d))];(3)TAIL[HEAD[((a,b),(c,d))]];(4)HEAD[TAIL[HEAD[((a,b),(c,d))]]];(5)TAIL[HEAD[TAIL[((a,b),(c,d))]]];实习题若矩阵Am×n 中的某个元素aij是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该矩阵中的一个马鞍点。

假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。

第五章答案5.2设有三对角矩阵A n×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。

【解答】(1)k=2(i-1)+j(2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余)5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。

南京大学数据结构(商琳)first

南京大学数据结构(商琳)first
实践性较强。
Department of Computer Science & Technology, Nanjing university
fall 2009
ห้องสมุดไป่ตู้
数据结构的发展概况
DATA STRUCTURES
20世纪60年代初期 高级程序设计语言 20世纪60年代中期 开设表处理语言 20世纪60年代后期 数据结构的概念 20世纪70年代初期 “程序设计=算法+数据结构” 20世纪70年代中期 学科:数据结构 20世纪80年代初 我国
fall 2009
数据结构课程的特点
DATA STRUCTURES
数据结构课程是计算机专业基础课,主要训练学生 在系统开发中的数据设计、算法设计与分析及数据 组织的能力,它是后续多门课程,如数据库、操作 系统、编译原理、网络系统基础等的基础,对于从 事计算机系统开发的人员,是必修课程之一。
需要有关“程序设计”和“离散数学”的知识作为 课程的基础。
fall 2009
课时计划
Chapter 1 基本概念和算法分析 Chapter 2 线性表 Chapter 3 栈和队列 Chapter 4 数组、串与广义表 Chapter 5 树 Chapter 6 集合与字典 Chapter 7 搜索结构 Chapter 8 图 Chapter 9 排序 Chapter 10 文件、外部排序与索引
《数据结构》(第2版)
严蔚敏 清华大学出版社
《数据结构与算法描述——C语言描述》
(美)Mark Allen Weiss
冯舜玺译
Department of Computer Science & Technology, Nanjing university

南京大学数据结构(商琳)Chapter2

南京大学数据结构(商琳)Chapter2

fall
顺序表(SeqList)类的定义
P.46
DATA STRUCTURES
const int defaultSize = 100;
template <class Type> class SeqList {
Type *data; //顺序表存储数组
int MaxSize;
//最大允许长度
int last;
int SeqList<Type>::Remove ( Type & x ) {
//在表中删除已有元素 x
int i = Find (x);
//在表中搜索 x
if ( i >= 0 ) {
last-- ;
for ( int j = i; j <= last; j++ )
data[j] = data[j+1];
Department of Computer Science & Technology, Nanjing University
fall
virtual bool Insert(int i, E x) = 0;
//插入
virtual bool Remove(int i, E& x) = 0; //删除
i++; if ( i > last ) return -1; else return i; }
Department of Computer Science & Technology, Nanjing University
fall
顺序表的查找、插入和删除
DATA STRUCTURES
查找: int Serach ( Type & x ) 主要思想:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1
2
3
45 67
8 9 10
Department of Computer Science & Technology, Nanjing University
fall 2009
DATA STRUCTURES
(4)若结点编号i为奇数,且i!=1,则它的左兄 弟为结点i-1。
(5)若结点编号i为偶数,且i!=n,则它的右兄 弟为结点i+1。
fall 2009
DATA STRUCTURES
树的示意图 (P.187)
Department of Computer Science & Technology, Nanjing University
fall 2009
树的特点
DATA STRUCTURES
• 每棵子树的根结点有且仅有一个直接前驱, 但可以有0个或多个直接后继。
根以外的其他结点划分为 m (m 0) 个互不相交的
有限集合T1, T2, …, Tm,每个集合又是一棵树,并 且称之为根的子树。
每棵子树的根结点有且仅有一个直接前驱,但可以
有0个或多个直接后继。
Department of Computer Science & Technology, Nanjing University
int InsertChild ( const position p, const Type &value );
int DeleteChild ( position p, int i );
Department of Computer Science & Technology, Nanjing University
Department of Computer Science & Technology, Nanjing University
fall 2009
DATA STRUCTURES
满二叉树
完全二叉树
•层次h,叶结点仅在 h和h-1两层出 现 • 对任一结点,若其右子树的高度为 k,则其左子树的高度是 k or k+1
Department of Computer Science & Technology, Nanjing University
fall 2009
DATA STRUCTURES
• 性质4 具有 n (n 0) 个结点的完全二叉树的高 度为 log2(n+1)
23-1 24-1
Department of Computer Science & Technology, Nanjing University
fall 2009
DATA STRUCTURES
定义1 满二叉树 (Full Binary Tree)
如果二叉树中所有分支结点的度数都为2, 且叶子结点都在同一层次上,则称这类二 叉树为满二叉树。
定义2 完全二叉树 (Complete Binary Tree)
如果一棵具有n个结点的高度为k的二叉树,它的 每一个结点都与高度为k的满二叉树中编号为1-n 结点一一对应,则称这棵二叉树为完全二叉树。 (从上到下从左到右编号)
Department of Computer Science & Technology, Nanjing University
fall 2009
DATA STRUCTURES
自由树
Department of Computer Science & Technology, Nanjing University
fall 2009
DATA STRUCTURES
L
R
LR
二叉树的五种不同形态
Department of Computer Science & Technology, Nanjing University
fall 2009
二叉树的性质
DATA STRUCTURES
•性质1 若二叉树的层次从1开始, 则在二叉树 的第 i 层最多有 2i -1个结点。(i ≥ 1)
A
0层
BC
D
E F GH I J
1层
height
2层 = 3
KL
M
3层
Department of Computer Science & Technology, Nanjing University
fall 2009
术语
结点
子女 祖先
结点的度 双亲 子孙
分支结点 兄弟 结点层次
叶结点
public:
BinaryTree ( );
//构造函数
BinaryTree ( BinTreeNode<Type> * lch,
BinTreeNode<Type> * rch, Type item );
//构造以item为根,lch和rch为左、右
//子树的二叉树
int IsEmpty ( );
//判二叉树空否?
0 2 6 14 30
DATA STRUCTURES
02
6
14
30
Department of Computer Science & Technology, Nanjing University
fall 2009
二叉树的链表表示
DATA STRUCTURES
leftChild data rightChild
第 5章 树
树和森林的概念 二叉树 二叉树的表示 二叉树遍历及其应用 线索化二叉树 树与森林 堆 Huffman树
DATA STRUCTURES
Department of Computer Science & Technology, Nanjing University
fall 2009
Tree ( ); ~Tree ( ); position Root ( ); BuildRoot ( const Type& value ); position FirstChild ( position p ); position NextSibling ( position p ); position Parent ( position p ); Type GetData ( position p );
fall 2009
有根树:
DATA STRUCTURES
一棵有根树 T,简称为树,它是n (n≥0) 个结点的
有限集合。当n = 0时,T 称为空树;否则,T 是
非空树,记作
Φ ,
n0
T {r,T1 ,T2 ,...,Tm }, n 0
r 是一个特定的称为根(root)的结点,它只有直接 后继,但没有直接前驱;
•性质2 深度为 k 的二叉树最多有 2k-1个结点。 k ≥0
Department of Computer Science & Technology, Nanjing University
fall 2009
DATA STRUCTURES
•性质3 对任何一棵二叉树, 如果其叶结点有
n0 个, 度为2的非叶结点有 n2 个, 则有 n0=n2+1
BinTreeNode<Type> * RightChild ( ); //取右子女结点地址
int Insert ( const Type& item ); //插入 int Find ( const Type &item ) const; //搜索 Type GetData ( ) const; //取得结点数据 BinTreeNode<Type> *GetRoot ( ) const;
fall 2009
一般二叉树的顺序表示
1 3 78
0 2
56 11 13

0 1 2 3 5 6 7 8 9 11 13
DATA STRUCTURES
Department of Computer Science & Technology, Nanjing University
fall 2009
极端情形: 只有右单支的二叉树
(6)结点i所在层次为log2i+1
1
2
3
45 67
8 9 10
Department of Computer Science & Technology, Nanjing University
fall 2009
二叉树的抽象数据类型
DATA STRUCTURES
template <class Type> class BinaryTree {
树和森林的概念
DATA STRUCTURES
两种树:自由树与有根树。
自由树:
一棵自由树 Tf 可定义为一个二元组
Tf = (V, E) 其中V = {v1, ..., vn} 是由 n (n>0) 个元素组成的 有限非空集合,称为顶点集合。E = {(vi, vj) | vi, vj V, 1≤i, j≤n} 是n-1个序对的集合,称为边集合, E 中的元素 (vi, vj)称为边或分支。
证明:若设度为1的结点有 n1 个,总结点 个数为 n,总边数为 e,则根据二叉树的定
义,
n = n0 + n1 + n2 e = n - 1 =2n2 + n1 =
因此,有 2n2 + n1 = n0 + n1 + n2 - 1
n2 = n0 - 1
n0 = n2 + 1
Department of Computer Science & Technology, Nanjing University
相关文档
最新文档