数据结构课件_第八讲之一(树)
合集下载
PHP数据结构之八 树与二叉树
因此,设立一个状态标志变量tag,tag=1,暂时不访问结点的值,tag=2,访问结点的值
3.完全二叉树
如果深度为k,由n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应,该二叉树称为完全二叉树。
性质4:n个结点的完全二叉树深度为:└㏒2n┘ +1。
其中符号: └x┘表示不大于x的最大整数。
性质5:若对一棵有n个结点的完全二叉树(深度为└㏒2n┘+1)的结点按层(从第1层到第㏒2n +1层)序自左至右进行编号,则对于编号为i(1≦i≦n)的结点:
1.先序遍历
递归算法
算法的递归定义是:
若二叉树为空,则遍历结束;否则
⑴ 访问根结点;
⑵ 先序遍历左子树(递归调用本算法);
⑶ 先序遍历右子树(递归调用本算法)。
非递归算法
设T是指向二叉树根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T;
⑴ 访问p所指向的结点;
Байду номын сангаас 若某结点在第l(l≧1)层,则其子结点在第l+1层。
双亲结点在同一层上的所有结点互称为堂兄弟结点。
⑹ 结点的层次路径、祖先、子孙
从根结点开始,到达某结点p所经过的所有结点成为结点p的层次路径(有且只有一条)。
结点p的层次路径上的所有结点(p除外)称为p的祖先(ancester) 。
(三)二叉树
1.二叉树的定义
二叉树(Binary tree)是n(n≥0)个结点的有限集合。若n=0时称为空树,否则:
⑴ 有且只有一个特殊的称为树的根(Root)结点;
⑵ 若n>1时,其余的结点被分成为二个互不相交的子集T1,T2,分别称之为左、右子树,并且左、右子树又都是二叉树。
3.完全二叉树
如果深度为k,由n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应,该二叉树称为完全二叉树。
性质4:n个结点的完全二叉树深度为:└㏒2n┘ +1。
其中符号: └x┘表示不大于x的最大整数。
性质5:若对一棵有n个结点的完全二叉树(深度为└㏒2n┘+1)的结点按层(从第1层到第㏒2n +1层)序自左至右进行编号,则对于编号为i(1≦i≦n)的结点:
1.先序遍历
递归算法
算法的递归定义是:
若二叉树为空,则遍历结束;否则
⑴ 访问根结点;
⑵ 先序遍历左子树(递归调用本算法);
⑶ 先序遍历右子树(递归调用本算法)。
非递归算法
设T是指向二叉树根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T;
⑴ 访问p所指向的结点;
Байду номын сангаас 若某结点在第l(l≧1)层,则其子结点在第l+1层。
双亲结点在同一层上的所有结点互称为堂兄弟结点。
⑹ 结点的层次路径、祖先、子孙
从根结点开始,到达某结点p所经过的所有结点成为结点p的层次路径(有且只有一条)。
结点p的层次路径上的所有结点(p除外)称为p的祖先(ancester) 。
(三)二叉树
1.二叉树的定义
二叉树(Binary tree)是n(n≥0)个结点的有限集合。若n=0时称为空树,否则:
⑴ 有且只有一个特殊的称为树的根(Root)结点;
⑵ 若n>1时,其余的结点被分成为二个互不相交的子集T1,T2,分别称之为左、右子树,并且左、右子树又都是二叉树。
第八章 图论8.4树及其应用.ppt
⑥ G中每一对结点之间有惟一一条基本通路。(n≥2)
2017/10/10 82-9
定理4.2.1 分析
直接证明这 6 个命题两两等价工作量太大,一 般采用循环论证的方法,即证明
(1) (2) (3) (4) (5) (6) (1) 然后利用传递行,得到结论。
2017/10/10
证明 TG = <VT, ET> 是 G = <V, E> 的生 分析 必要性:假设 必要性由树的定义即得,充分性利用构造性 成树,由定义 4.2.1 , TG 是连通的,于是 G 也是连通的。 方法,具体找出一颗生成树即可
充分性:假设G = <V, E>是连通的。如果G中无回 路, G 本身就是生成树。如果 G 中存在回路 C1 ,可删除 C1中一条边得到图G1,它仍连通且与G有相同的结点集。 如果G1中无回路,G1就是生成树。如果G1仍存在回路C2, 可删除 C2 中一条边,如此继续,直到得到一个无回路 的连通图H为止。因此,H是G的生成树。
2017/10/10 82-22
思考题
1、一个图的生成树是不是唯一的呢?
2、如果不是唯一的,3个顶点的无向完全图有几棵 生成树?4个顶点的无向完全图又有几棵生成树?n 个顶点的无向完全图又有几棵生成树?
完全图是边数最 多的简单无向图
2017/10/10
82-23
定理4.2.3
一个图G = <V, E>存在生成树TG = <VT, ET>的充分 必要条件是G是连通的。
由定理4.2.1(4) 在结点给定的无向图中, 由定理4.2.1(5) 树是边数最多的无回路图 树是边数最少的连通图 由此可知,在无向图G = (n, m)中, 若m<n-1,则G是不连通的 若m>n-1,则G必含回路
数据结构之树和二叉树ppt
G D E F
数据结构中讨论的一般都是有序树
清华大学出版社
数据结构(C++版) 数据结构( ++版 ++
5.1 树的逻辑结构
树的基本术语
森林: 棵互不相交的树的集合。 森林:m (m≥0)棵互不相交的树的集合。 棵互不相交的树的集合 A B E K L F C H D J
清华大学出版社
数据结构(C++版) 数据结构( ++版 ++
data parent
data:存储树中结点的数据信息 : parent:存储该结点的双亲在数组中的下标 :
清华大学出版社
数据结构(C++版) 数据结构( ++版 ++
5.1 树的逻辑结构
树的抽象数据类型定义
Parent 前置条件: 前置条件:树已存在 输入:结点x 输入:结点 功能:求结点x的双亲 功能:求结点 的双亲 输出:结点x的双亲的信息 输出:结点 的双亲的信息 后置条件: 后置条件:树保持不变 Depth 前置条件: 前置条件:树已存在 输入: 输入:无 功能: 功能:求树的深度 输出: 输出:树的深度 后置条件: 后置条件:树保持不变
清华大学出版社
数据结构(C++版) 数据结构( ++版 ++
5.1 树的逻辑结构
树的抽象数据类型定义
PreOrder 前置条件: 前置条件:树已存在 输入: 输入:无 功能: 功能:前序遍历树 输出:树的前序遍历序列 输出: 后置条件: 后置条件:树保持不变 PostOrder 前置条件: 前置条件:树已存在 输入: 输入:无 功能:后序遍历树 功能: 输出: 输出:树的后序遍历序列 后置条件: 后置条件:树保持不变 endADT
清华大学出版社
数据结构(C++版) 数据结构( ++版 ++
数据结构树和二叉树ppt
A
B
C
D
E
FG
H
I
J
K
LM
树形表示法
(2) 文氏图表示法。使用集合以及集合的 包含关系描述树结构。下图就是树的文氏图 表示法。
A
C B
G EF
J
H D
IK LM
文氏图表示法
(3) 凹入表示法。使用线段的伸缩描述树结 构。下图是树的凹入表示法。
(4) 括号表示法。将树的根结点写在括号的左 边,除根结点之外的其余结点写在括号中并用逗号 间隔来描述树结构。下图是树的括号表示法。
1层 层次 根为第1层
最大层数为树的深度(高度)
2层 height 3层 = 4
双亲 (直接前驱) 孩子(直接后继)
KL
M d=0 4层
兄弟 堂兄弟 子孙 祖先
森林----m(m>=0)棵互不相交的树的集合。
B EF
A BC
树和森林的遍历
A C GH
F DG E
先 深根度次优序先遍遍历历
当树非先空根次序遍历
树孩结子点结结点构的:序da号ta
}link; he指ad向ptr下一个孩子结点typedef struct
特点:很快确定孩子指结向点第一个孩子结点{ dliantkaty*pheeaddapttar;;
每个结点但拥有确孩定子双的亲个效数率不同低,
所以采用单链表链接孩子结点。
}ctree; ctree T[maxnode];
bcd
在二叉树中查找指定结点
?a
? find(BTNode *b, elemtype x) {
b
c
if(b==NULL)
return(NULL); /*空树*/
最新-数据结构7-8-9树-PPT文档资料
本章重点:二叉树的 表示和实现
15
16 物料管理
数据结构
2、二叉树
为何要重点研究每结点最多只有两个 “叉” 的树?
二叉树的结构最简单,规律性最强; 所有树都能转为唯一对应的二叉树(可以预习6.4节)。
(1). 二叉树的定义 (2). 二叉树的性质 (3). 二叉树的存储结构
2019/4/22
2019/4/22 11
12 物料管理
数据结构
结点A的度:3 结点B的度:2 结点M的度:0
结点A的孩子:B,C,D 结点B的孩子:E,F 树的度:3 E K L A
叶子:K,L,F,G,M,I,J
结点I的双亲:D 结点L的双亲:E 结点B,C,D为兄弟 结点K,L为兄弟 J 树的深度:4
B
F
C
G H M
16
17 物料管理
数据结构
2、二叉树
(1)、二叉树的定义
是n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的分别称 为左子树和右子树的二叉树组成。(即:空或有一个根,根有左子树、右子 树;而左右子树本身又是二叉树。)
逻辑结构: 一对二(1:2) 基本特征:① 每个结点最多只有两棵子树 (不存在度大于2的结点); ② 左子树和右子树次序不能颠倒。
3. 深度为9的二叉树中至少有
A)29 B)28 C)9
C 个结点。
D)29-1
2019/4/22
20
21 物料管理
数据结构
2、二叉树
•满二叉树: 一棵深度为k 且有2k -1个结 点的二叉树。 特点:每层都 “充满”了结 点
B
A C
L
•完全二叉树: 深度为k 的、有n个 结点的二叉树,当且 仅当其每一个结点都 与深度为k 的满二叉 树中编号从1至n的结 L 点一一对应。
数据结构 第八周 树的基本概念PPT共57页
数据结构 第八周 树的基本概念
21、没有人陪你走一辈子,所以你要 适应孤 独,没 有人会 帮你一 辈子, 所以你 要奋斗 一生。 22、当眼泪流尽的时候,留下的应该 是坚强 。 23、要改变命运,首先改变自己。
24、勇气很有理由被当作人类德性之 首,因 为这种 德性保 证了所 有其余 的德性 。--温 斯顿. 丘吉尔 。 25、梯子的梯阶从来不是用来搁脚的 ,它只 是让人 们的脚 放上一 段时间 ,以便 让别一 只脚能 够再往财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
21、没有人陪你走一辈子,所以你要 适应孤 独,没 有人会 帮你一 辈子, 所以你 要奋斗 一生。 22、当眼泪流尽的时候,留下的应该 是坚强 。 23、要改变命运,首先改变自己。
24、勇气很有理由被当作人类德性之 首,因 为这种 德性保 证了所 有其余 的德性 。--温 斯顿. 丘吉尔 。 25、梯子的梯阶从来不是用来搁脚的 ,它只 是让人 们的脚 放上一 段时间 ,以便 让别一 只脚能 够再往财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
数据结构PPT(树和二叉树)
安
徽 理
第6章 树和二叉树
工
大 本章学习导读
学
树型结构是一类重要的非线性结构。它的特点是结点之
间有分支,并具有明显的层次关系的结构。树在计算机领
域中有着广泛的应用,例如在编译程序中,用树来表示源
程序的语法结构;在数据库系统中,可用树来组织信息;
在分析算法的行为时,可用树来描述其执行过程。
本章重点讨论二叉树的存储表示及其各种运算,并研究
假设对所有j, 1≤j﹤i,命题成立,即第j层上至多有2 j-1 个
结点。
由归纳假设第i-1 层上至多有 2i -2个结点。
由于二叉树的每个结点的度至多为2,故在第i层上的最大结
点数为第i-1层上的最大结点数的2倍,即2×2i -2= 2 i-1。
安
徽 理
6.2.2 二叉树的性质
工
大 学
性质2 深度为 k 的二叉树至多有 2 k-1个结点(k ≥1)。
一般树和森林与二叉树的转换关系,最后介绍树的应用实
例。
安
徽 理
6.1 树的定义和基本术语
工
大 学
❖ 什么是树?树是由 n (n ≥ 0) 个结点的有限集合。如果 n
= 0,称为空树;如果 n > 0,则
▪ 有且仅有一个特定的称之为根(Root)的结点,它只有直
接后继,但没有直接前驱;
▪ 当n > 1,除根以外的其它结点划分为 m (m >0) 个互不
相交的有限集 T1, T2 ,…, Tm,其中每个集合本身又是一棵 树,并且称为根的子树(SubTree)。
安
徽 理
树的示例
A
工
B
C
D
大
学
E
徽 理
第6章 树和二叉树
工
大 本章学习导读
学
树型结构是一类重要的非线性结构。它的特点是结点之
间有分支,并具有明显的层次关系的结构。树在计算机领
域中有着广泛的应用,例如在编译程序中,用树来表示源
程序的语法结构;在数据库系统中,可用树来组织信息;
在分析算法的行为时,可用树来描述其执行过程。
本章重点讨论二叉树的存储表示及其各种运算,并研究
假设对所有j, 1≤j﹤i,命题成立,即第j层上至多有2 j-1 个
结点。
由归纳假设第i-1 层上至多有 2i -2个结点。
由于二叉树的每个结点的度至多为2,故在第i层上的最大结
点数为第i-1层上的最大结点数的2倍,即2×2i -2= 2 i-1。
安
徽 理
6.2.2 二叉树的性质
工
大 学
性质2 深度为 k 的二叉树至多有 2 k-1个结点(k ≥1)。
一般树和森林与二叉树的转换关系,最后介绍树的应用实
例。
安
徽 理
6.1 树的定义和基本术语
工
大 学
❖ 什么是树?树是由 n (n ≥ 0) 个结点的有限集合。如果 n
= 0,称为空树;如果 n > 0,则
▪ 有且仅有一个特定的称之为根(Root)的结点,它只有直
接后继,但没有直接前驱;
▪ 当n > 1,除根以外的其它结点划分为 m (m >0) 个互不
相交的有限集 T1, T2 ,…, Tm,其中每个集合本身又是一棵 树,并且称为根的子树(SubTree)。
安
徽 理
树的示例
A
工
B
C
D
大
学
E
数据结构讲解树和森林.ppt
树和森林的概念 二叉树 (Binary Tree) 二叉树的表示 二叉树遍历 (Binary Tree Traversal) 线索化二叉树 (Threaded Binary Tree) 堆 ( Heap ) 树与森林 (Tree & Forest) 二叉树的计数 霍夫曼树 (Huffman Tree)
若i > 0, 则 i 的双亲为(i -1)/2 若2*i+1 < n, 则 i 的左子女为2*i+1
若2*i+2 < n, 则 i 的右子女为2*i+2 若 i 为偶数, 且i != 0, 则其左兄弟为i-1
若 i 为奇数, 且i != n-1, 则其右兄弟为i+1 i 所在层次为 log2 (i+1)
void SetData ( const Type & item ) { data = item; }
void SetLeft ( BinTreeNode <Type> *L ) { leftChild = L; }
void SetRight ( BinTreeNode <Type> *R ) { rightChild = R; }
结点(node) 结点的度(degree) 分支(branch)结点 叶(leaf)结点 子女(child)结点 双亲(parent)结点
兄弟(sibling)结点
有序树
祖先(ancestor)结点 无序树
子孙(descendant)结点 森林
结点所处层次(level)
树的高度(depth)
二叉树的抽象数据类型
template <class Type> class BinaryTree { public:
若i > 0, 则 i 的双亲为(i -1)/2 若2*i+1 < n, 则 i 的左子女为2*i+1
若2*i+2 < n, 则 i 的右子女为2*i+2 若 i 为偶数, 且i != 0, 则其左兄弟为i-1
若 i 为奇数, 且i != n-1, 则其右兄弟为i+1 i 所在层次为 log2 (i+1)
void SetData ( const Type & item ) { data = item; }
void SetLeft ( BinTreeNode <Type> *L ) { leftChild = L; }
void SetRight ( BinTreeNode <Type> *R ) { rightChild = R; }
结点(node) 结点的度(degree) 分支(branch)结点 叶(leaf)结点 子女(child)结点 双亲(parent)结点
兄弟(sibling)结点
有序树
祖先(ancestor)结点 无序树
子孙(descendant)结点 森林
结点所处层次(level)
树的高度(depth)
二叉树的抽象数据类型
template <class Type> class BinaryTree { public:
零基础学数据结构树PPT课件
树中的相对位置。结点结构如图9.4所示。
data parent
第13页/共128页
9.1 树
•
在C语言中,通常采用数组存储双亲表示的树结点,这类似于静态链表
的实现。一棵树结构及树的双亲表示法如图9.5所示。
A
B
C
D
E
F
G
H IJ
双亲 数组下标 结点 位置
0 A -1 1B 0 2C 0 3D 0 4E 1 5F 1 6G 3 7H 6 8I 6 9J 6
4E ^ 5F ^ 6G
孩子结点
7H ^ 8I ^
9J ^
1 4
6^
2 5^
3^
7
8
9^
第16页/共128页
9.1 树
•
为此,需要设计两个结点结构,一个是孩子链表的孩子结点,如图9.6所
示。其中,child是数据域,存放结点在表头数组中的下标;next是指针域,
存放指向下一个孩子结点的指针。另一个是表头数组的表头结点,如图9.7所
A
B E K L F
C G M H I N D
J
第8页/共128页
9.1 树
• 树的抽象数据类型
•
1.数据对象集合
•
树的数据对象集合为树的各个结点的集合。一个数据元素只有一个直接前
驱,但可能有m(m≥0)个直接后继。元素之间是一对多的关系。例如,在树
(A(B(E(K,L),F),C(G(M),H,I(N)),D(J)))中,’G’、’H’和’I’是结点’C’的后
9.1 树
•
(9)Inser tChild(&T,p,Child)
• 初始条件:树T已存在,p指向T中的某个结点。
数据结构--树 ppt课件
A BC D
树的度::=
madxeg (nro)ed ee
no tdreee
例如, degree of this tree = 3.
父节点(Parent) ::= 有子树的节点是 其子树根节点的父节点。
E F G HI J
KL
M
子节点(Child) ::= 若A节点是B节点的父节点,则B节点是A节点 的子节点,也叫孩子节点。
A BC D E F G HI J
KL
M
B
E
F
A
C
G
H
D
I
J
§1 预备知识
因此,每个节点的大小取决于 子树数目。噢,这样并不太好! K L M
§1 预备知识
❖ 儿子-兄弟表示法
Element FirstChild NextSibling
A BC D E F G HI JFra bibliotekKLM
A
N
B
C
D
N
E
F G HI J
第四章 树
§1 预备知识
客观世界中许多事物存在层次关系 ◦ 人类社会家谱 ◦ 社会组织结构 ◦ 图书信息管理
图书
哲
学
…
宗
教
文 学
医 药 卫
农 业 科
工 业 技
生学术
综
…
合
哲 学 理
世
欧
界 哲
…
洲 哲
宗 教
论学
学
电 工 技 术
计 算… 机
建 筑 科 学
水 利 工 程
宗 教 分 析 研 究
宗 教… 理 论 与 概 况
} }
T ( N ) = O( N )
数据结构 第八周 树的基本概念57页PPT
数据结构 第八周 树的基本概念
6、法律的基础有两个,而且只有两个……公平和实用。——伯克 7、有两种和平的暴力,那就是法律和礼节。——歌德
8、法律就是秩序,有好的法律才有好的秩序。——亚里士多德 9、上帝把法律和公平凑合在一起,可是人类却把它拆开。——查·科尔顿 10、一切法律都是无用的,因为好人用不着它们,而坏人又不会因为它们而变得规矩起来。——德谟耶克斯
66、节制使快乐增加并使享受加强。 ——德 谟克利 特 67、今天应做的事没有做,明天再早也 是耽误 了。——裴斯 泰洛齐 68、决定一个人的一生,以及整个命运 的,只 是一瞬 之间。 ——歌 德 69、懒人无法享受休息之乐。——拉布 克 70、浪费时间是一桩大罪过。——卢梭
பைடு நூலகம்
6、法律的基础有两个,而且只有两个……公平和实用。——伯克 7、有两种和平的暴力,那就是法律和礼节。——歌德
8、法律就是秩序,有好的法律才有好的秩序。——亚里士多德 9、上帝把法律和公平凑合在一起,可是人类却把它拆开。——查·科尔顿 10、一切法律都是无用的,因为好人用不着它们,而坏人又不会因为它们而变得规矩起来。——德谟耶克斯
66、节制使快乐增加并使享受加强。 ——德 谟克利 特 67、今天应做的事没有做,明天再早也 是耽误 了。——裴斯 泰洛齐 68、决定一个人的一生,以及整个命运 的,只 是一瞬 之间。 ——歌 德 69、懒人无法享受休息之乐。——拉布 克 70、浪费时间是一桩大罪过。——卢梭
பைடு நூலகம்
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构 大话《数据结构》
崔基哲 2012年
算法和数据结构 1
第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章
绪论 算法 线性表 栈和队列 串 树 图 查找 排序
算法和数据结构
2
树的定义
金庸武侠小说《笑傲江湖》中的人物。
读过《笑傲江湖》的几乎没人不知道“ 桃谷六仙”,这六人怪异之极,动不动 就把人撕成4片 老大:桃根仙 老二:桃干仙 老三老四:桃枝仙、桃叶仙(这两位的 先后顺序他们自己都说不明白) 老五:桃花仙 老六:桃实仙
小游戏(1)
用天平称东西,需要称出“1克~13克 ”
– 1克~13克,均为整数
问题1:需要多少个“砝码”? 问题2:如果给4个砝码,你能称1~( ) 克?
小游戏(2)
我在纸上写好一个100以内的正整数, 请大家想办法猜出我写的是哪一个? 注意,你们猜的数字不能超过7个 我的回答只会告诉你是“大了”,”小了”
data nextsibling
typedef struct CSNode{ Elem data; struct CSNode *firstchild, *nextsibling; } CSNode, *CSTree;
下课!
第六章 树
线性表
数 据 结 构 的 三 个 方 面
A.线性结构 1.数据的逻辑结构 B.非线性结构
栈 队
树形结构
图形结构
2、数据的存储结构
A B
顺序存储 链式存储
3、数据的运算:检索、排序、插入、删除、修改等。
线性表——结点间是以线性关系联结 线性结构
A , B , C , ··· ·· ,X ,Y , Z ··
学 生 成 绩 表
学号 9861109 9861107 9861103 姓名 张卓 刘忠赏 胡孝臣 成绩 100 95 86
树形结构
全校学生档案管理的组织方式
树形结构
族谱
爷爷 父亲 哥哥 你 弟弟 伯伯 叔叔 一个数据 元素也称 为结点。
…… ……
数据元素存在一种非线性关系,是以分支关系定义的层次结构。
typedef struct CSNode { DataType data; Struct CSNode *FirstChild, *Nextsibling; } * CSTree;
将此图所示的树向左下方旋转45度,就会得到一棵二叉树
孩子兄弟链表表示法示意图
对应
结论:树的孩子兄弟链表表示法与对应二叉树的二叉链表表示法相同。 因此,上图中的树与二叉树之间存在相互转换的关系。
子树之间不存在确定的次序关系。
有序树与无序树: 树中结点的各子树从左至右是有 次序的(不能互换)则称该树为 有序树,否则称该树为无序树。
森林(Forest):
是m(m≥0)棵互不相交的树的集合
root
F B E K F L
A
C G H D I J M
线性结构
第一个数据元素 (无前驱) 最后一个数据元素 (无后继) 其它数据元素 (一个前驱、 一个后继)
a b d g e h i c data fc f 0 1 2 3 4 5 6 7 a b c d e f g ^ ^ ^ 2 4 6
树的存储结构
孩子链表
3 5 ^
^ ^
7
8
9
^
8
h
i
^
^
如何找双亲 结点
9
树的存储结构
– 带双亲的孩子链表
a b d g e h i c data parent fc 1 a 0 1 1 2 ^ 7 ^ ^ ^ ^ 8 9 ^ 2 4 6 3 5 ^ ^
结点A的孩子:B,C,D 结点B的孩子:E,F 结点A的层次:1 结点M的层次:4
A C F G H M D I J
结点I的双亲:D 结点L的双亲:E
结点B,C,D为兄弟 结点K,L为兄弟
B
E
树的深度:4
K
L
结点F,G为堂兄弟 结点A是结点F,G的祖先
有向树:
(1) 有确定的根; (2) 树根和子树根之间为有向关系。 有序树: 子树之间存在确定的次序关系。 无序树:
六位桃兄,你们的相貌和这 位朋友全然不像, 可比他俊美得多了。 桃根仙骨格清奇、 桃干仙身材魁伟、 桃枝仙四肢修长、 桃叶仙眉清目秀、 桃花仙呢……这个……这个目如朗星, 桃实仙精神饱满,任谁一见到, 立刻都知是六位行侠仗义的玉面英雄,英俊少……这个英俊中年。” 群雄听了,尽皆 大笑。桃谷六仙更是大为高兴。 老头子吃过这六兄弟的苦头,知道他们极不好惹, 跟着凑 趣,说道:“依在下之见,环顾天下英雄, 武功高的固多,说到相貌,那是谁也比不上桃 谷六仙了。” 群豪跟着起哄,有的说:“岂仅俊美而已,简直是风流潇洒。前无古人,后无来者。 ” 有的说:“潘安退避三舍,宋玉甘拜下风。” 有的说:“武林中从第一到第六的美男子 , 自当算他们六位。令狐公子最多排到第七。”
C语言的类型描述
#define SIZE 100 结点结构: data
typedef struct PTNode { Elem data; int parent; // 双亲位置域 } PTNode;
一、双亲表示法
parent
树结构
typedef struct { PTNode nodes[SIZE]; int r, n; // 根结点的位置和结点个数 } ptree;
结点A的度:3 结点B的度:2 结点M的度:0
B
A C
叶子:K,L,F,G,M,I,J
D
E K L
F
G
H M
I
J
树的度:3
基本术语
孩子(child)——结点子树的根称为该结点的孩子 双亲(parents)——孩子结点的上层结点 兄弟(sibling)——同一双亲的孩子 结点的层次(level)——从根结点算起,根为第一层,它 的孩子为第二层…… 树的深度(depth)——树中结点的最大层次数
三、孩子兄弟表示法(二叉树表示法) • 实现:用二叉链表作树的存储结构,链表中每个结点的两个指 针域分别指向其第一个孩子结点和下一个兄弟结点
特点 操作容易 破坏了树的层次
a a b d e b ^ c e ^ g ^ ^ ^
c
f
^ d
f
^
^ i ^
^ h
g
h
i
C语言的类型描述:
结点结构: firstchild
树型结构
根结点 (无前驱)
多个叶子结点 (无后继) 其它数据元素 (一个前驱、 多个后继)
树的三种存储结构
一、双亲表示法 二、孩子(链表)表示法
三、孩子兄弟表示法
双亲(链表)表示法
用一组连续的存储空间(数组)来存储 树中的结点,每个数组元素中不但包含结 点本身的信息,还保存该结点双亲结点在 数组中的下标号。数组中每个结点含两个 域: • 数据域:存放结点本身信息 • 双亲域:指示本结点的双亲结点在数 组中位置
data parent
A
B E
C
F G
D
如何找孩子 结点
0 1 2 3 4 5 6
A B C D E F G
-1 0 0 0 2 2 5
参考教科书,157页,表6-4-3
二、孩子链表表示法:
孩子链表:每个结点的孩子结点用单链表存储,再用含n个元素 的结构数组指向每个孩子链表。
孩子结点结构:
typedef struct CTNode { int child; struct CTNode *next; } *ChildPtr; child next
f
2
4 6 7 8 9
b
d f
3 c
5 e
^
2
3 5 5 5
g
h i
孩子兄弟链表表示法
又称为二叉链表表示法,即以二叉链表作为树的 存储结构。链表中每个结点设有两个链域,与二叉树 的二叉链表表示法所不同的是,这两个链域分别指向 该结点的第一个孩子结点和下一个兄弟(右兄弟)。
FirstChild data Nextsibling
第六章
树的类型定义 树的抽象数据类型 树的存储结构 二叉树的定义
树
二叉树的性质
二叉树本概念
– 定义:树(tree)是n(n>0)个结点的有限集T,其 中:
• 有且仅有一个特定的结点,称为树的根(root) • 当n>1时,其余结点可分为m(m>0)个互不相交的有 限集T1,T2,……Tm,其中每一个集合本身又是一棵 树,称为根的子树(subtree)
双亲结点结构
typedef struct { Elem data; ChildPtr firstchild; // 孩子链的头指针 } CTBox; data firstchild
typedef struct { CTBox nodes[MAX_TREE_SIZE]; int n, r; // 结点数和根结点的位置 } CTree; //树结构
– 特点:
• 树中至少有一个结点——根 • 树中各子树是互不相交的集合
只有根结点的树 A 根 有子树的树 A
T1
B
T2
C
T3 D
E
F
G
H
I
J
K
L
子树
M
基本术语
结点(node)——表示树中的元素,包括数据项及若干指向其 子树的分支 结点的度(degree)——结点拥有的子树数 树的度——一棵树中最大的结点度数 叶子(leaf)——度为0的结点
崔基哲 2012年
算法和数据结构 1
第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章
绪论 算法 线性表 栈和队列 串 树 图 查找 排序
算法和数据结构
2
树的定义
金庸武侠小说《笑傲江湖》中的人物。
读过《笑傲江湖》的几乎没人不知道“ 桃谷六仙”,这六人怪异之极,动不动 就把人撕成4片 老大:桃根仙 老二:桃干仙 老三老四:桃枝仙、桃叶仙(这两位的 先后顺序他们自己都说不明白) 老五:桃花仙 老六:桃实仙
小游戏(1)
用天平称东西,需要称出“1克~13克 ”
– 1克~13克,均为整数
问题1:需要多少个“砝码”? 问题2:如果给4个砝码,你能称1~( ) 克?
小游戏(2)
我在纸上写好一个100以内的正整数, 请大家想办法猜出我写的是哪一个? 注意,你们猜的数字不能超过7个 我的回答只会告诉你是“大了”,”小了”
data nextsibling
typedef struct CSNode{ Elem data; struct CSNode *firstchild, *nextsibling; } CSNode, *CSTree;
下课!
第六章 树
线性表
数 据 结 构 的 三 个 方 面
A.线性结构 1.数据的逻辑结构 B.非线性结构
栈 队
树形结构
图形结构
2、数据的存储结构
A B
顺序存储 链式存储
3、数据的运算:检索、排序、插入、删除、修改等。
线性表——结点间是以线性关系联结 线性结构
A , B , C , ··· ·· ,X ,Y , Z ··
学 生 成 绩 表
学号 9861109 9861107 9861103 姓名 张卓 刘忠赏 胡孝臣 成绩 100 95 86
树形结构
全校学生档案管理的组织方式
树形结构
族谱
爷爷 父亲 哥哥 你 弟弟 伯伯 叔叔 一个数据 元素也称 为结点。
…… ……
数据元素存在一种非线性关系,是以分支关系定义的层次结构。
typedef struct CSNode { DataType data; Struct CSNode *FirstChild, *Nextsibling; } * CSTree;
将此图所示的树向左下方旋转45度,就会得到一棵二叉树
孩子兄弟链表表示法示意图
对应
结论:树的孩子兄弟链表表示法与对应二叉树的二叉链表表示法相同。 因此,上图中的树与二叉树之间存在相互转换的关系。
子树之间不存在确定的次序关系。
有序树与无序树: 树中结点的各子树从左至右是有 次序的(不能互换)则称该树为 有序树,否则称该树为无序树。
森林(Forest):
是m(m≥0)棵互不相交的树的集合
root
F B E K F L
A
C G H D I J M
线性结构
第一个数据元素 (无前驱) 最后一个数据元素 (无后继) 其它数据元素 (一个前驱、 一个后继)
a b d g e h i c data fc f 0 1 2 3 4 5 6 7 a b c d e f g ^ ^ ^ 2 4 6
树的存储结构
孩子链表
3 5 ^
^ ^
7
8
9
^
8
h
i
^
^
如何找双亲 结点
9
树的存储结构
– 带双亲的孩子链表
a b d g e h i c data parent fc 1 a 0 1 1 2 ^ 7 ^ ^ ^ ^ 8 9 ^ 2 4 6 3 5 ^ ^
结点A的孩子:B,C,D 结点B的孩子:E,F 结点A的层次:1 结点M的层次:4
A C F G H M D I J
结点I的双亲:D 结点L的双亲:E
结点B,C,D为兄弟 结点K,L为兄弟
B
E
树的深度:4
K
L
结点F,G为堂兄弟 结点A是结点F,G的祖先
有向树:
(1) 有确定的根; (2) 树根和子树根之间为有向关系。 有序树: 子树之间存在确定的次序关系。 无序树:
六位桃兄,你们的相貌和这 位朋友全然不像, 可比他俊美得多了。 桃根仙骨格清奇、 桃干仙身材魁伟、 桃枝仙四肢修长、 桃叶仙眉清目秀、 桃花仙呢……这个……这个目如朗星, 桃实仙精神饱满,任谁一见到, 立刻都知是六位行侠仗义的玉面英雄,英俊少……这个英俊中年。” 群雄听了,尽皆 大笑。桃谷六仙更是大为高兴。 老头子吃过这六兄弟的苦头,知道他们极不好惹, 跟着凑 趣,说道:“依在下之见,环顾天下英雄, 武功高的固多,说到相貌,那是谁也比不上桃 谷六仙了。” 群豪跟着起哄,有的说:“岂仅俊美而已,简直是风流潇洒。前无古人,后无来者。 ” 有的说:“潘安退避三舍,宋玉甘拜下风。” 有的说:“武林中从第一到第六的美男子 , 自当算他们六位。令狐公子最多排到第七。”
C语言的类型描述
#define SIZE 100 结点结构: data
typedef struct PTNode { Elem data; int parent; // 双亲位置域 } PTNode;
一、双亲表示法
parent
树结构
typedef struct { PTNode nodes[SIZE]; int r, n; // 根结点的位置和结点个数 } ptree;
结点A的度:3 结点B的度:2 结点M的度:0
B
A C
叶子:K,L,F,G,M,I,J
D
E K L
F
G
H M
I
J
树的度:3
基本术语
孩子(child)——结点子树的根称为该结点的孩子 双亲(parents)——孩子结点的上层结点 兄弟(sibling)——同一双亲的孩子 结点的层次(level)——从根结点算起,根为第一层,它 的孩子为第二层…… 树的深度(depth)——树中结点的最大层次数
三、孩子兄弟表示法(二叉树表示法) • 实现:用二叉链表作树的存储结构,链表中每个结点的两个指 针域分别指向其第一个孩子结点和下一个兄弟结点
特点 操作容易 破坏了树的层次
a a b d e b ^ c e ^ g ^ ^ ^
c
f
^ d
f
^
^ i ^
^ h
g
h
i
C语言的类型描述:
结点结构: firstchild
树型结构
根结点 (无前驱)
多个叶子结点 (无后继) 其它数据元素 (一个前驱、 多个后继)
树的三种存储结构
一、双亲表示法 二、孩子(链表)表示法
三、孩子兄弟表示法
双亲(链表)表示法
用一组连续的存储空间(数组)来存储 树中的结点,每个数组元素中不但包含结 点本身的信息,还保存该结点双亲结点在 数组中的下标号。数组中每个结点含两个 域: • 数据域:存放结点本身信息 • 双亲域:指示本结点的双亲结点在数 组中位置
data parent
A
B E
C
F G
D
如何找孩子 结点
0 1 2 3 4 5 6
A B C D E F G
-1 0 0 0 2 2 5
参考教科书,157页,表6-4-3
二、孩子链表表示法:
孩子链表:每个结点的孩子结点用单链表存储,再用含n个元素 的结构数组指向每个孩子链表。
孩子结点结构:
typedef struct CTNode { int child; struct CTNode *next; } *ChildPtr; child next
f
2
4 6 7 8 9
b
d f
3 c
5 e
^
2
3 5 5 5
g
h i
孩子兄弟链表表示法
又称为二叉链表表示法,即以二叉链表作为树的 存储结构。链表中每个结点设有两个链域,与二叉树 的二叉链表表示法所不同的是,这两个链域分别指向 该结点的第一个孩子结点和下一个兄弟(右兄弟)。
FirstChild data Nextsibling
第六章
树的类型定义 树的抽象数据类型 树的存储结构 二叉树的定义
树
二叉树的性质
二叉树本概念
– 定义:树(tree)是n(n>0)个结点的有限集T,其 中:
• 有且仅有一个特定的结点,称为树的根(root) • 当n>1时,其余结点可分为m(m>0)个互不相交的有 限集T1,T2,……Tm,其中每一个集合本身又是一棵 树,称为根的子树(subtree)
双亲结点结构
typedef struct { Elem data; ChildPtr firstchild; // 孩子链的头指针 } CTBox; data firstchild
typedef struct { CTBox nodes[MAX_TREE_SIZE]; int n, r; // 结点数和根结点的位置 } CTree; //树结构
– 特点:
• 树中至少有一个结点——根 • 树中各子树是互不相交的集合
只有根结点的树 A 根 有子树的树 A
T1
B
T2
C
T3 D
E
F
G
H
I
J
K
L
子树
M
基本术语
结点(node)——表示树中的元素,包括数据项及若干指向其 子树的分支 结点的度(degree)——结点拥有的子树数 树的度——一棵树中最大的结点度数 叶子(leaf)——度为0的结点