数据结构第六章

合集下载

计算机导论-第6章 数据结构

计算机导论-第6章 数据结构
⑴集合结构。在集合结构中,数据元素间的关系是“属于 同一个集合”。集合是元素关系极为松散的一种结构。
单击此处添课程名 ⑵线性结构。该结构的数据元素之间存在着一对一的关系。
⑶树型结构。该结构的数据元素之间存在着一对多的关系。
⑷图型结构。该结构的数据元素之间存在着多对多的关系, 图形结构也称作网状结构。
具有特殊的意义,称为栈顶。相应地,表尾 称为栈底。不含任何元素的栈称为空栈。
2. 栈的数学性质
假设一个栈S中的元素为an,an-1,..,a1,则 称a1为栈底元素,an为栈顶元 素。栈中的
元 时素 候按 ,单出a ,a栈击2,的..此,元an素-处1,都an添是的栈次课顶序程元进素栈名。。换在句任话何
第六章 数单据击结此构处添课程名
第6章 数据结构
• 数据结构是计算机软件和计算机应用专业的 核心课程之一,对于学习计算机专业的其他 课程,如操作系统、编译原理、数据库管理
系的统 。、 数软 据单件 结击工 构程主此、要处人研工究添智数能据课等表程都示是 与名十 存储分的有方益
法、抽象的逻辑结构及其上定义的各种基本 操作。数据的逻辑结构常常采用数学描述的 抽象符号和有关的理论。如使用串、表、数 组、图等结构和理论来表示数据在存储时的 逻辑结构,研究这些结构上定义的各种操作 。
本章内容
• 6.1 数据结构的概念 • 6.2 几种典型的数据结构 • 6.3 查找
• 6.4 单排序击此处添课程名
6.1 数据结构的概念
• 在系统地学习数据结构知识之前,先对一 些与数据结构相关的基本概念和术语赋予 确切的含义。
• 数 算机据单识(别D击at、a此)存是储处信和添息加的工课载处体理程,。名它它能是够计被算计机 程序加工的原料,应用程序处理各种各样 的数据。

数据结构-6 树和二叉树

数据结构-6 树和二叉树

第六章树和二叉树一.选择题1. 以下说法错误的是。

A.树形结构的特点是一个结点可以有多个直接前趋B.线性结构中的一个结点至多只有一个直接后继C.树形结构可以表达(组织)更复杂的数据D.树(及一切树形结构)是一种"分支层次"结构2. 如图6-2所示的4 棵二叉树中,不是完全二叉树。

图6-2 4 棵二叉树3. 在线索化二叉树中,t 所指结点没有左子树的充要条件是。

A. t->left == NULLB. t->ltag==1C. t->ltag==1 且t->left==NULL D .以上都不对4. 以下说法错误的是。

A.二叉树可以是空集B.二叉树的任一结点最多有两棵子树C.二叉树不是一种树D.二叉树中任一结点的两棵子树有次序之分5. 以下说法错误的是。

A.完全二叉树上结点之间的父子关系可由它们编号之间的关系来表达B.在三叉链表上,二叉树的求双亲运算很容易实现C.在二叉链表上,求根,求左、右孩子等很容易实现D.在二叉链表上,求双亲运算的时间性能很好6. 如图6-3所示的4 棵二叉树,是平衡二叉树。

图6-3 4 棵二叉树7. 如图6-4所示二叉树的中序遍历序列是。

A. abcdgefB. dfebagcC. dbaefcgD. defbagc图6-4 1 棵二叉树8. 已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是。

A. acbedB. decabC. deabcD. cedba9. 如果T2 是由有序树T 转换而来的二叉树,那么T 中结点的前序就是T2 中结点的。

A. 前序B.中序C. 后序D. 层次序10. 某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是。

A. bdgcefhaB. gdbecfhaC. bdgaechfD. gdbehfca11. 将含有83个结点的完全二叉树从根结点开始编号,根为1号,后面按从上到下、从左到右的顺序对结点编号,那么编号为41的双亲结点编号为。

数据结构(C语言版)严蔚敏第6章 树和二叉树

数据结构(C语言版)严蔚敏第6章 树和二叉树
如图6-1(b)中结点H、I、J、K、L、M、N是叶子 结点,而所有其它结点都是分支结点。
⑷ 孩子结点、双亲结点、兄弟结点
一个结点的子树的根称为该结点的孩子结点(child) 或子结点;相应地,该结点是其孩子结点的双亲结点 (parent)或父结点。
4
如图6-1(b)中结点B 、C、D是结点A的子结点,而结 点A是结点B 、C、D的父结点;类似地结点E 、F是结 点B的子结点,结点B是结点E 、F的父结点。
这是树的递归定义,即用树来定义树,而只有 一个结点的树必定仅由根组成,如图6-1(a)所示。
2
2 树的基本术语
⑴ 结点(node):一个数据元素及其若干指向其子树的分支。 ⑵ 结点的度(degree) 、树的度:结点所拥有的子树
的棵数称为结点的度。树中结点度的最大值称为树的度。
A
B
C
D
A
E
F G HI J
同一双亲结点的所有子结点互称为兄弟结点。
如图6-1(b)中结点B 、C、D是兄弟结点;结点E 、 F是兄弟结点。
⑸ 层次、堂兄弟结点
规定树中根结点的层次为1,其余结点的层次等于 其双亲结点的层次加1。
若某结点在第l(l≧1)层,则其子结点在第l+1层。
双亲结点在同一层上的所有结点互称为堂兄弟结点。 如图6-1(b)中结点E、F、G、H、I、J。
(a) 只有根结点
K
LM N
图6-1 树的示例形式
(b) 一般的树
3
如图6-1(b)中结点A的度是3 ,结点B的度是2 ,结点 M的度是0,树的度是3 。
⑶ 叶子(left)结点、非叶子结点:树中度为0的
结点称为叶子结点(或终端结点)。相对应地,度不为 0的结点称为非叶子结点(或非终端结点或分支结点)。 除根结点外,分支结点又称为内部结点。

数据结构(CC++语言版)第六章new

数据结构(CC++语言版)第六章new
为简单路径。
回路 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路径
为回路或环。
路径长度
非带权图的路径长度是指此路径上边的条数。 带权图的路径长度是指路径上各边的权之和。
▪图的连通 在无向图G中,若两个顶点vi和vj之间有 路径存在,则称vi 和vj 是连通的。若G中任意两 个顶点都是连通的,则称G为连通图。非连通图的 极大连通子图叫做连通分量。
5 9
1
12
63
8
15
76
6
3
4
16
7
60
A
B 40 80 C
30
75
35
D
E
45
▪子图 设有两个图 G=(V, E) 和 G‘=(V’, E‘)。若 V’ V 且 E‘E, 则称 图G’ 是 图G 的子图。
路径 在图 G=(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1,
种带权图叫做网。
▪生成树 一个连通图的生成树是它的极小 连通子图,在n个顶点的情形下,有n-1条 边。生成森林
不予讨论的图 包含顶点到其自身的边; 一条边在图中重复出现
6.2 图的存储结构
一. 图的数组表示法 (邻接矩阵表示法)
基本思想:
✓ 图需要存储的信息:顶点和弧。 ✓ 引入两个数组,一个记录各个顶点信息的顶点表,还
有一个表示各个顶点之间关系的邻接矩阵。
设图 A = (V, E)是一个有 n 个顶点的图,则图的 邻接矩阵是一个二维数组 A.arcs[n][n],定义:
1 arcs[i][j] = 0
若<vi, vj> 或 (vi, vj) E 反之
2
1

数据结构第六章 哈夫曼树

数据结构第六章 哈夫曼树

6.3哈夫曼树6.3.1基本术语1.路径和路径长度若在一棵中存在着一个结点序列k1 ,k2,…,kj,使得ki是k1+i 的双亲(1ji<≤),则称此结点序列是从k1~kj的路径,因树中每个结点只有一个双亲结点,所以它也是这两个结点之间k 1~kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1(实际就是边数)。

如在图5-19(a)所示的二叉树中,从树根结点L到叶子结点P的路径为结点序列L、M、S、P,路径长度为3。

(a) (b)(c) (d)图5-19 二叉排序树的删除2.结点的权和带权路径长度在许多应用中,常常将树中的结点赋上一个有着某种意义的实数,我们称此实数为该结点的权。

结点的带权路径长度规定为从树根结点到该结点之间的路径长度与该结点上权的乘积3.树的带权路径长度树的带权路径长度定义为树中所有叶子结点的带权路径长度这和,通常记为:2 WPL = ∑=n i i i lw 1其中n 表示叶子结点的数目,i w 和i l 分别表示叶子结点i k 的权值和根到i k 之间的路径长度 。

4.哈夫曼树哈夫曼(Huffman)树又称最优二叉树。

它是n 个带权叶子结点构成的所有二叉树中,带权路径长度 WPL 最小的二叉树。

因为构造这种树的算法是最早由哈夫曼于1952年提出的,所以被称之为哈夫曼树。

例如,有四个叶子结点a 、b 、c 、d ,分别带权为9、4、5、2,由它们构成的三棵不同的二叉树(当然还有其它许多种)分别如图5-20(a)到图5-20(c)所示。

b ac a b cd d c a b d(a) (b) (c)图5-20 由四个叶子结点构成的三棵不同的带权二叉树 每一棵二叉树的带权路径长度WPL 分别为:(a) WPL = 9×2 + 4×2 + 5×2 + 2×2 = 40(b) WPL = 4×1 + 2×2 + 5×3 + 9×3 = 50(c) WPL = 9×1 + 5×2 + 4×3 + 2×3 = 37其中图5-20(c)树的WPL 最小,稍后便知,此树就是哈夫曼树。

数据结构-第6章 树和二叉树---4. 树和森林(V1)

数据结构-第6章 树和二叉树---4. 树和森林(V1)
ElemType data ; struct CSnode *firstchild, *nextsibing ; }CSNode;
6.4.1 树的存储结构
R AB C D EG F
R⋀
A
⋀D
⋀B
⋀E ⋀
C⋀
⋀G
⋀F ⋀
6.4.2 树、森林和二叉树的转换
1. 树转换为二叉树 将树转换成二叉树在“孩子兄弟表示法”中已 给出,其详细步骤是: ⑴ 加线。在树的所有相邻兄弟结点之间加一 条连线。 ⑵ 去连线。除最左的第一个子结点外,父结点 与所有其它子结点的连线都去掉。 ⑶ 旋转。将树以根结点为轴心,顺时针旋转 450,使之层次分明。
B C
D
A E
L HK
M
技巧:无左孩子 者即为叶子结点
6.4.3 树和森林的遍历
1. 树的遍历 由树结构的定义可知,树的遍历有二种方法。 ⑴ 先序遍历:先访问根结点,然后依次先序 遍历完每棵子树等。价于对应二叉树的先序遍历
⑵ 后序遍历:先依次后序遍历完每棵子树,然 后访问根结点。等价于对应二叉树的中序遍历
0 R -1 1A 0 2B 0 3C 0
}Ptree ; R
4D 1 5E 1
AB C
6F 3
7G 6
DE
F
8H 6
9I 6
G H I 10~MAX_Size-1 ... ...
6.4.1 树的存储结构
2. 孩子表示法
每个结点的孩子结点构成一个单链表,即有n 个结点就有n个孩子链表;
n个孩子的数据和n个孩子链表的头指针组成一 个顺序表; 结点结构定义: 顺序表定义:
typedef struct PTNode { ElemType data ;

数据结构-C语言描述(第三版)(陈慧南)章 (6)

数据结构-C语言描述(第三版)(陈慧南)章 (6)

第6章 树 例如,设有序表为(21, 25, 28, 33, 36, 43),若要在表中 查找元素36,通常的做法是从表中第一个元素开始,将待查元素 与表中元素逐一比较进行查找,直到找到36为止。粗略地说,如 果表中每个元素的查找概率是相等的,则平均起来,成功查找一 个元素需要将该元素与表中一半元素作比较。如果将表中元素组 成图6-3所示的树形结构,情况就大为改观。我们可以从根结点 起,将各结点与待查元素比较,在查找成功的情况下,所需的最 多的比较次数是从根到待查元素的路径上遇到的结点数目。当表 的长度n很大时,使用图6-3所示的树形结构组织表中数据,可 以很大程度地减少查找所需的时间。为了查找36,我们可以让36 与根结点元素28比较,36比28大,接着查右子树,查找成功。显 然,采用树形结构能节省查找时间。
第6章 树
E
E
A
F
B
G
CD
LJ
M
N
T1
X
YZ
U T2
B
F
A
DC
G
JL
T3 N
M
(a)
(b)
图6-2 树的例子
(a) 树T1和T2组成森林;(b) 树T3
第6章 树
6.2 二 叉 树
二叉树是非常重要的树形数据结构。很多从实际问题中抽 象出来的数据都是二叉树形的,而且许多算法如果采用二叉树 形式解决则非常方便和高效。此外,以后我们将看到一般的树 或森林都可通过一个简单的转换得到与之相应的二叉树,从而 为树和森林的存储及运算的实现提供了有效方法。
第6章 树
图6-1描述了欧洲部分语言的谱系关系,它是一个后裔图, 图中使用的描述树形结构数据的形式为倒置的树形表示法。在 前几章中,我们学习了多种线性数据结构,但是一般来讲,这 些数据结构不适合表示如图6-1所示的层次结构的数据。为了 表示这类层次结构的数据,我们采用树形数据结构。在本章中 我们将学习多种不同特性的树形数据结构,如一般树、二叉树、 穿线二叉树、堆和哈夫曼树等。

数据结构第六章

数据结构第六章
i 1 k ( 第 i 层的最大结点数 ) 2 2 1 i 1 i 1 k k
K
L
M
任何一棵非空树是一个二元组 Tree = (root,F) 其中:root 被称为根结点, F 被称为子树森林

6.2 二叉树
定义
定义:二叉树是n(n0)个结点的有限集,它或为空树 (n=0),或由一个根结点和两棵分别称为左子树和右子树 的互不相交的二叉树构成 二叉树,度为2的树? 特点
树和二叉树
树是一类重要的非线性数据结构,以分支 关系描述数据元素之间的层次结构 6.1 树 定义: 树(tree)是n(n≥0)个结点的有限集。在任意一棵非
空树中:
有且仅有一个特殊的结点,称为树的根结点(root)
当n>1时,除根结点之外的其余结点可分为
m(m>0)个 互不相交的有限集合T1,T2,……Tm,其 中每一个集合本身又是一棵树,称为根的子树 (subtree)
证明:用归纳法证明之 i=1时,只有一个根结点,2i-1 = 20 = 1; 假设对所有j(1j<i)命题成立,即第j层上至多有2j-1 个结 点,那么,第i-1层至多有2i-2个结点 又二叉树每个结点的度至多为2 第i层上最大结点数是第i-1层的2倍,即2i-2 2 = 2i-1 故命题得证 k 性质2:深度为k的二叉树至多有 2 1 个结点(k1) 证明:由性质1,可得深度为k 的二叉树最大结点数是
基本操作 P :
插入类:
InitTree(&T) // 初始化臵空树 CreateTree(&T, definition) // 按定义构造树 Assign(T, cur_e, value) // 给当前结点赋值 InsertChild(&T, &p, i, c) // 将以c为根的树插入为 结点p的第i棵子树

数据结构——用C语言描述 第六章 树状结构

数据结构——用C语言描述  第六章 树状结构

数据结构——用C语言描述第六章树状结构在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问和操作这些数据。

树状结构是一种重要的数据结构,它在许多算法和应用中都发挥着关键作用。

树状结构就像是一棵倒立的树,有一个根节点,然后从根节点向下延伸出许多分支,每个分支又可以进一步延伸出更多的分支。

这种结构使得数据的组织和管理更加清晰和高效。

在树状结构中,每个节点可以包含数据以及指向其子节点的指针。

节点之间通过这些指针形成层次关系。

树状结构的一个重要特点是,除了根节点外,每个节点都有且仅有一个父节点。

二叉树是树状结构中最常见的一种形式。

二叉树中的每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉搜索树是一种特殊的二叉树,它具有一定的规则。

对于二叉搜索树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而其右子树中的所有节点的值都大于该节点的值。

这种特性使得在二叉搜索树中进行查找、插入和删除操作的效率很高。

例如,如果要在二叉搜索树中查找一个值,我们可以从根节点开始。

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

直到找到目标值或者确定该值不存在。

用 C 语言来实现二叉搜索树,首先需要定义一个节点结构体,来存储节点的数据以及左右子节点的指针。

```ctypedef struct TreeNode {int data;struct TreeNode left;struct TreeNode right;} TreeNode;```接下来,实现插入节点的函数。

插入节点时,需要按照二叉搜索树的规则,找到合适的位置插入新节点。

```cvoid insertNode(TreeNode root, int value) {if (root == NULL) {root =(TreeNode )malloc(sizeof(TreeNode));(root)>data = value;(root)>left = NULL;(root)>right = NULL;return;}if (value <(root)>data) {insertNode(&((root)>left), value);} else if (value >(root)>data) {insertNode(&((root)>right), value);}}```查找节点的函数也类似,根据比较值的大小在左右子树中递归查找。

第6章 数据结构-二维数组

第6章 数据结构-二维数组
2
,…β m)
其中每一个数据元素β i是一个行向量
β
i =(ai1,
ai2, ai3,… …ain,)
12
二维数组的初步认识
一般地,二维数组的逻辑结构可表示为: Array_2 = (D, R) 其中, D={aij | i=c1, c1+1,…, d1; j= c2, c2+1,…, d2; aij∈Data Object} R={ROW, COL} ROW={< aij,ai,j+1>| c1≤i≤d1 ; c2≤j≤d2-1 ; aij,ai,j+1∈D} COL={< aij,ai+1,j>| c1≤i≤d1-1 ; c2≤j≤d2 ; ai+1,j,aij∈D} 其中:(c1, d1)和(c2,d2)分别为数组下标i, j的一对界偶(即 满足条件c1≤i≤d1,c2≤j≤d2)。 称C1,c2为下界,通常取c1 = c2= 1; 称d1,d2为上界,通常取d1= m,d2= n
将item设计成一维排列是为了使 矩阵中的行数和列数在存储量 容许的情形下可以进行变化;
矩阵类的构造函数
Matrix:: Matrix(float a[], int row, int col) { int j; m=row; n=col; item=new float [m*n]; for (j=0;j<m*n;j++ ) item[j]=a[j]; }; Matrix:: Matrix(Matrix& b) { int j; m=b.m; n=b.n; item=new float [m*n]; for (j=0;j<m*n;j++ ) item[j]=b.item[j]; };

数据结构与算法-第6章

数据结构与算法-第6章

如果 e=(u, v) 是 E(G) 中的一条边,则称 u 与 v
互为邻接点或相邻点;称边e与顶点u,v关联;
如果 a=<u, v> 是 E(G) 中的一条弧,则称u邻接到v
或v邻接于u,也称弧a与顶点u,v关联.
9
6.1 图的基本概念
顶点的度(与树中结点的度不同): –无向图中,顶点的度是与每个顶点关联的边数, 记作TD(v) –有向图中,顶点的度分成入度与出度 •入度:以该顶点为终头的弧的数目,记为ID(v) •出度:以该顶点为始点的弧的数目,记为OD(v) 一个顶点的度等于该顶点的入度与出度之和,即 TD(v)=OD(v)+ID(v)
20
带权图的邻接矩阵
wij 若(vi,vj)∈E或<vi,vj>∈E
A[i][j]= ∞ 其它 0 i=j
21
用邻接矩阵表示的图的类的定义
class AdjMatrix { int n; int matrix[MaxSize][ MaxSize]; public: AdjMatrix(int m) { n=m; } }; // AdjMatrix class AdjMatrix { const int INFINITE=∞; int n; float matrix[MaxSize][MaxSize]; public: AdjMatrix(int m) { n=m;} }; // AdjMatrix // 非带权图 // 顶点的个数 // 邻接矩阵
回路——第一个顶点和最后一个顶点相同的路径。
简单回路——除了第一个顶点和最后一个顶点外,其
余顶点不重复出现的回路。
11
6.1 图的基本概念
V0V1V3V2
V0V1V3V0V1V2

数据结构_第六章_图_练习题与答案详细解析(精华版)

数据结构_第六章_图_练习题与答案详细解析(精华版)

图1. 填空题⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。

【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。

⑵ 任何连通图的连通分量只有一个,即是()。

【解答】其自身⑶ 图的存储结构主要有两种,分别是()和()。

【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。

⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。

【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。

⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。

【解答】求第j列的所有元素之和⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。

【解答】出度⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。

【解答】前序,栈,层序,队列⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。

【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。

⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。

【解答】回路⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。

【解答】vi, vj, vk【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。

数据结构 第六章 树和二叉树

数据结构 第六章  树和二叉树

F
G
H
M
I
J
结点F,G为堂兄弟 结点A是结点F,G的祖先
5
树的基本操作
树的应用很广,应用不同基本操作也不同。下面列举了树的一些基本操作: 1)InitTree(&T); 2)DestroyTree(&T); 3)CreateTree(&T, definition); 4)ClearTree(&T); 5)TreeEmpty(T); 6)TreeDepth(T); 7) Root(T); 8) Value(T, &cur_e); 9) Assign(T, cur_e, value); 10)Paret(T, cur_e); 11)LeftChild(T, cur_e); 12)RightSibling(T, cur_e); 13)InsertChild(&T, &p, i, c); 14)DeleteChild(&T,&p, i); 15)TraverseTree(T, Visit( ));
1
2 4 8 9 10 5 11 12 6 13 14 3 7 15 4 6 2
1
3
5 7
证明:设二叉树中度为1的结点个数为n1 根据二叉树的定义可知,该二叉树的结点数n=n0+n1+n2
又因为在二叉树中,度为0的结点没有孩子,度为1的结点有1 个孩子,度为2的结点有2个结孩子,故该二叉树的孩子结点 数为 n0*0+n1*1+n2*2(分支数) 而一棵二叉树中,除根结点外所有都为孩子结点,故该二叉 树的结点数应为孩子结点数加1即:n=n0*0+n1*1+n2*2+1
文件夹1
文件夹n

数据结构 第6章 排序

数据结构  第6章  排序

判断某序列是否符合堆定义
只要将序列依次排成一棵完全二叉树,所有结点的 值都不大于(或不小于)其左右子树结点的值,那么该 序列就符合堆的定义。 例:序列:102、87、100、79、82、62、84
10 2 87 10 0 82
故: 此序列符 合堆定义。
84
79
62
若n个元素的排序码k1,k2,k3,…,kn满足堆,且让结点 按1、2、3、…、n顺序编号,根据完全二叉树的性质(若i为 根结点,则左孩子为2i,右孩子为2i+1)可知,堆排序实际与 一棵完全二叉树有关。若将排序码初始序列组成一棵完全二 叉树,则堆排序可以包含建立初始堆(使排序码变成能符合 堆的定义的完全二叉树)和利用堆进行排序两个阶段。
14
17
25 )
20
9
(3
14
17
20
25 )
9
第五次插入
(3
9
14
17
20
25)
图 9-1 直接插入排序示例
注意:
排正序时,要插入的元素先和有序表中最后 一个元素进行比较,即从后往前;排逆序时, 则刚相反,得从前往后进行比较。 当n很小时,直接插入排序的效率较高,时间 复杂度为o(n^2)。 正序时比较次数最少为n-1; 逆序时最大为(n+2)*(n-1)/2; 两者的平均值约为(n^2)/4。
例如,n=6,数组R的六个排序码分别为:17,3,25,14,20, 9。下面用图9-3给出冒泡排序算法的执行过程。
0 1 2 3 4 5
初始状态
(17
3
25
14
20
9)
第一趟排序
3
(17
9
25

数据结构 第六章-树

数据结构 第六章-树

20
A B C D
E
F
G H
I J
A
E F H
G
B C
D A
I J
A
B C F
E H
G
B C D F
E G H I J
21
I
D
J
5. 二叉树转换成树和森林
二叉树转换成树 1. 加线:若p结点是双亲结点的左孩子,则将p的右孩 子,右孩子的右孩子,……沿分支找到的所有右孩 子,都与p的双亲用线连起来 2. 抹线:抹掉原二叉树中双亲与右孩子之间的连线 3. 调整:将结点按层次排列,形成树结构7Fra bibliotek6.3.2
树和森林的存储结构
树的存储结构有很多,既可以采用顺序存储结构, 也可以采用链式存储结构。但无论采用哪种存储方式, 都要求存储结构不仅能存储各结点本身的数据信息,还 要能惟一地反映树中各结点之间的逻辑关系。 双亲表示法 孩子链表表示法 孩子兄弟表示法
8
1.双亲表示法 除根外,树中的每个结点都有惟一的一个双亲结点,所以可以用一 组连续的存储空间存储树中的各结点。一个元素表示树中一个结点, 包含树结点本身的信息及结点的双亲结点的位臵。 A B E F C G H D I
}CTBox;
//树结构 typedef struct {CTBox nodes[MAX_TREE_SIZE]; int n, r; }Ctree
12
3. 孩子-兄弟表示法(树的二叉链表)
孩子兄弟表示法用二叉链表作为树的存储结构。将树中的多支关系用 二叉链表的双支关系体现。 ※ 结点的左指针指向它的第一个孩子结点
//孩子结点结构 typedef struct CTNode
1 2 3 4 5 6
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
B A
C
if (!StackEmpty(S)){
Pop(S,p); if(!Visit(p->data)) return ERROR; Push(S,p->rchild);} } return Ok; }
G
D
E H
F
I K
J
M
按先序序列建立二叉树的二叉链表的算法 Status CreateBiTree(BiTree &T) { //按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树 scanf(&ch); if (ch==‘’) T=NULL; else { if (!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; }
(a)
两棵不同的二叉树
(b)
(c) 一棵普通树
6.2.2 二叉树的性质
性质1 二叉树第i层上的结点数目最多为2i-1(i>=1). 性质2 深度为k的二叉树至多有2k-1个结点(k>=1)。
证明:
(第i层上的最大结点数) 2i 1 2k 1
i 1 i 1
k
k
性质3 在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为 n2,则n0 = n2 +1。 证明:设n1为二叉树T中度为1的结点数。因为所有结点的度均小于或等 于2,所以其结点总数为 n=n0+n1+n2 (6.1)
再看二叉树中的分支数。除了根结点外,其余都有一个分支进入,设B 为分支总数,则n=B+1。由于这些分支是由度为1或2的结点射出,所以 又有B=n1+2n2。于是得
n=n1+2n2+1
由式(6-1)和(6-2)得 n0=n2+1 几种特殊形态的二叉树 1、满二叉树 2、完全二叉树
(6.2)
一棵深度为k且含有2k-1个结点的二叉树。
第六章 树和二叉树
举例 1、家谱 6.1 树的定义和术语 2、行政组织结构 3、编译系统中表示源程序的语法结构 树是n(n>0)个结点的有限集合T,它满足如下两个条件: 4、数据库系统中组织信息 (1)有且仅有一个特定的称为根ROOT的结点。 (2)其余结点可分为m(m>=0)个互不相交的有限集合 T1,T2,…,Tm,其中每个集合又都是一棵树,并称其为根的子树 (SubTree)。 树的递归定义刻画了树的固有特性,即一棵树是由若干棵子树 构成的,而子树又可由若干棵更小的子树构成。
B E
C F
D
G
H
I
J
A 3、分支结点 度不为0的结点。 B 4、结点的孩子 结点的子树的根。 E 该结点称为孩子的双亲。 同一个双亲的孩子之间互称兄弟。 结点的祖先是从根到该结点所经分 支上的所有结点。 以某结点为根的子树中的任一结点 都称为该结点的子孙。 C F D
G
H
I
J
分支结点为 J结点的祖先 A、B、D和F 为A、B、F。
7、树的高度或深度
树中结点的最大层次称为树的高度。 8、有序树和无序树 若将树中结点的各子树看成从左 到右有次序的,则称该树为有序树, 否则称为无序树。 9、森林 森林是m棵互不相交的树的集合。 对树中每个结点而言,其子树的集合 即为森林。因此,可以用森林和树相 互递归的定义来描述树。 E B C
如输入字符: A B C $ $ D E $ G $ $ F $ $ $
A T={A,B,C,D,E,F,I,J},其中A 是根结点 T1={B,E,F,I,J} T2={C} E B C D G H
F
T3={D,G,H}
T11={E} T12={F,I,J}
I
J
图6.1树的示例
树的不同表示方法:
1、用嵌套集合表示 2、用广义表表示 A(B(E,F(I,J)),C,D(G,H))
若一棵二叉树至多只有最下面的两层上结点的度数可以小 于2,并且最下层上的结点都集中在该层最左边的若干位置上。
1
1 3
2
满二叉 完全二 树
叉树
7 4 1 5
2
3
4
5
6
5
6
7
8
9
1 0
11
12
1 3
14
8
9
1 0
11
12
1 3
(a)
1
(b)
1
2
3
非完全 二叉树
2
3
4
5
4
6 7
5
6
(c)
(d)
性质4 具有n个结点的完全二叉树的深度为 log2 n 1 证明:假设深度为k,则根据性质2和完全二叉树的定 义有:
6.3遍历二叉树和线索二叉树
6.3.1遍历二叉树
所谓遍历二叉树,就是按某条搜索路径巡访树中每个结点,使得每个结 点均被访问一次,而且仅被访问一次。 六种遍历方法:DLR、LDR、LRD、DRL、RDL、RLD。 其中L、D、R分别表示遍历左子树、访问根结点 和遍历右子树。 下面限定从左到右,则只有三种情况,分别为:先(根)序遍历、中(根)序 遍历、后(根)序遍历。
在完全二叉树,可以从一 个结点的编号就可推知其双 亲、左孩子、右孩子、兄弟 等结点的编号。
1 2 4 6 5 7 3
1
ቤተ መጻሕፍቲ ባይዱ
2
3
4
5
0
0
0
0
6
7
一般二叉树
二、链式存储结构
由二叉树的定义得知,其结点由一个 数据元素和分别指向其左、右子树的两 个分支构成,因此,表示二叉树的链表 中的结点至少包含三个域:数据域和左 右指针域。二叉链表 为了便于找到结点的双亲,还可在结 点结构中增加一个指向其双亲结点的指 针域。 三叉链表 二叉链表的定义: typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; LCHILD
Status InOrderTraverse(BiTree T, Status (*visit)(TElemType e))
{ InitStack(S); Push(S,T); While(!StackEmpty(S)) { while (GetTop(S,p) && p) Push(S, p->lchild); //向左走到头 Pop(S,p); //空指针退栈
2
于是:
k 1
1 n 2 1或2
k
k 1
n2
k
k 1 log2 n k
因为k是整数,所以k= log2 n 1 注:符号 x 表示不大于x的最大整数,反之, x 表示不小于x的 最小整数。
性质5 如果对一棵有n个结点的完全二叉树的结点按层序编号, 则对任一编号为i的结点ki(1=<i<=n) ,有:
基本操作:
1.Status CreateBiTree(BiTree &T); 2.Status PreOrderTraverse(BiTree T,Status (*visit)(TElemType e)); 3.Status InOrderTraverse(BiTree T,Status (*visit)(TElemType e)); 4.Status PostOrderTraverse(BiTree T,Status (*visit)(TElemType e)); 5.Status LevelOrderTraverse(BiTree T,Status (*visit)(TElemType e));
数据结构类型定义为:
#define MAX_TREE_SIZE 100 Typedef TElemType SqBiTree[MAX_TREE_SIZE]; SqBiTree bt; 完全二叉树
1 2
8
4 2
1 3
5 1 1 1 2
6
7
9
10
3
4
5
6
7
8
9
10 11 12
顺序存储结构仅适用于完全二 叉树。在最坏情况下,一个深度为 k且只有k个结点的单支树(树中 不存在度为2的结点)却需要长度 为2k-1的一维数组。
A
3、凹入表示法 B
E
I F A C C D G G H F J B I E J
A B C F D G H
E
D H
I
J
A 基本术语: 1、结点的度(Degree) 一个结点的子树个数。 一棵树中结点度的最大值称为该树 的度。 2、叶子(Leaf) 也称为终端结点,其度为0。
A的度为3, 树的度为3 C、E、I、J、G、 H的度为0。
H I K
J
M
DLR:ABDGHJKECFIM
LDR:GDJHKBEACFMI
LRD:GJKHDEBMIFCA
先序遍历二叉树基本操作的递归算法在二叉链表上的实现。 Stautus PreOrderTraverse(BiTree T,Status(* Visit)(TElemType e)) { //最简单的Visit函数是: // Status PrintElement(TElemType e) { // printf(e); // return OK; } // 调用实例:PreOrderTraverse( T, PrintElement ); If (T) { if (Visit(T->data)) if (PreOrderTraverse(T->lchild,Visit)) if (PreOrderTraverse(T->rchild,Visit)0 return OK; return ERROR; } else return OK; }//PreOrderTraverse
相关文档
最新文档