数据结构第六章

合集下载

计算机导论-第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棵子树
  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
相关文档
最新文档