数据结构课件 第6章

合集下载

数据结构PPT第6章树和二叉树

数据结构PPT第6章树和二叉树


徽 理
树的逻辑结构特点

大 学 1. 树中只有根结点没有前趋;
2. 除根外,其余结点都有且仅一个前趋;
3. 树的结点,可以有零个或多个后继;
4. 除根外的其它结点,都存在唯一条从
A
根到该结点的路径; 5. 树是一种分支结构。
B
C
D
E
FG H I J
KL
M

徽 理
树的应用

大 学
▪ 树可表示具有分支结构关系的对象
结论3知,x的右孩子应为2x+1,即2x+1=i,x=(i-1)/2。
故 i的双亲为└i/2┘ 证毕。

徽 理
6.2.3 二叉树的存储结构

大 学
❖ 顺序存储结构
所谓顺序存储结构,就是用一组连续的存储单元存储二
叉树的数据元素,结点在这个序列中的相互位置能反映出
结点之间的逻辑关系。 二叉树中结点之间的关系就是双亲
例1. 家族族谱
设某家庭有13个成员A、B、C、D、E、F、G、H、I、J
、K、L、M,他们之间的关系可如图所示的树表示。
例2. 单位行政机构的组织关系
A
B
C
D
E
FG H I J
KL
M

徽 理
树的应用

大 学
▪ 树是常用的数据组织形式
有些应用中数据元素之间并不存在分支结构关系,但是为
了便于管理和使用数据,将它们用树的形式来组织。
A
B
C
D
Ø
E
F
G H ØØØØI J
例如对于B结点而言: bt[2]的双亲为└1/2┘=1,即在bt[1]中 (为A); 其左孩子在bt[2i]=bt[4]中(为D); 其右孩子在bt[2i+1]=bt[5]中(为Ø )。

云大《数据结构》课程教学课件-第6章 树和二叉树(147P)_OK

云大《数据结构》课程教学课件-第6章 树和二叉树(147P)_OK

^d ^ ^ e ^ 三叉链表
3)二叉链表是二叉树最常用的存储结构。还有其它链接方 法,采用何种方法,主要取决于所要实施的各种运算频度。
例:若经常要在二叉树中寻找某结点的双亲时,可在每个结 点上再加一个指向其双亲的指针域parent,称为三叉链表。
lchild data parent rchild
2021/8/16
2021/8/16
9
6.2 二 叉 树
6.2.1 二叉树的概念
一、二叉树的定义: 二叉树(Binary Tree)是n(n>=0)个结点的有限集,它或者是 空集(n=0)或者由一个根结点和两棵互不相交的,分别称 为根的左子树和右子树的二叉树组成。 可以看出,二叉树的定义和树的定义一样,均为递归定 义。
A
集合3
集合1
BCD
EF
G
集合2
2021/8/16
3
2、树的表示方法 1)树形图法
A
BCD
EF
G
2)嵌套集合法
3)广义表形式 ( A(B, C(E,F), D(G) )
4)凹入表示法
2021/8/16
A B
D
CG
EF
A B C E DF G
4
3、 树结构的基本术语
1)结点的度(Degree):为该结点的子树的个数。 2)树的度:为该树中结点的最大度数。
7)路径(Path):若树中存在一个结点序列k1,k2,…,kj,使得ki是 ki+1的双亲(1<=i<j),则称该结点序列是从ki到kj一条路径 (Path)
路径长度:路径的长度为j-1,其为该路径所经过的边的数 目。
A
BCD
EF
G

数据结构第6章PPT课件

数据结构第6章PPT课件

性质3: 对任何一棵二叉树T,如果其终端结点数为n0,
度为2的结点数为n2,则 n0=n2+1。
性质4: 有n个结点的完全二叉性质5: 如果对一棵有n个结点的完全二叉树按层序从1
开始编号,则对任一结点(i<=i<=n), 有:
(1)如果i=1,则结点i是二叉 树的根结点;如果 i>1, 则其双亲结点是[i/2]。
练习2(第六章课后习题四、5)
已知完全二叉树的第6层有5个叶子,试画出所有满足这 一条件的完全二叉树,并指出结点最多的那棵树的叶子数
解: 完全二叉树的叶子只会出现在最下面两层
5
2、二叉树的性质
性质1: 在二叉树的第i (i>0)层上至多有2i-1个结点。
性质2: 深度为k的二叉树中至多有2k-1个结点(k>0)。
1、 二叉树的带权路径长度 WPL = n wklk k=1
其中,n:叶子结点个数, wk :第k个叶子的权, lk :第k个叶子到根的路径长度。
2、Huffman树的构造方法
(1)将{w1,w2,…….,wn}看成n个二叉树; (2)选择 2 个根结点的值最小的二叉树, 构造1个新的二叉树;…….;直至剩1个树止。
7
3∧ 5∧
8
9∧
23
3、 树与二叉树的转换
树转换成二叉树:(左孩子-右兄弟)
O
O
a
a
cg
bd e f
b
c
d
g
f
e
1. 树的先根遍历与对应二叉树的先序遍历相同;
2. 树的后根遍历相当于对应二叉树的中序遍历;
3. 树没有中序遍历,因为子树无左右之分。
24
4、 树的遍历

数据结构课件CH6

数据结构课件CH6
树是一类重要的非线性数据结构,是以分支关系 定义的层次结构。
§6.1 树的定义
定义:
树(tree)是n(n>0)个结点的有限集T,其中: 有且仅有一个特定的结点,称为树的根(root) 当n>1时,其余结点可分为m(m>0)个互不相交的有 限集T1,T2,……Tm,其中每一个集合本身又是一棵树, 称为根的子树(subtree)
• 每个结点至多有二棵子树(即不存在度大于2的结点) • 二叉树的子树有左、右之分,且其次序不能任意颠倒
★ 基本形态

A
A
A
A
只有根结 空二叉树 点的二叉树
B 右子树为空
B
B
C
左子树为空
左、右子 树均非空
二叉树的基本运算
① 构造一棵二叉树 CreateBTree ( BT) ② 清空以BT为根的二叉树 ClearBTree(BT) ③ 判断二叉树是否为空 BTreeEmpty(BT) ④ 获取给定结点的左孩子和右孩子
遍历的过程就是把非线性结构的二叉树中的结点排 成一个线性序列的过程。
二叉树遍历方法可分为两大类,一类是“宽度优先 ”法,即从根结点开始,由上到下,从左往右一层一层 的遍历;另一类是“深度优先法”,即一棵子树一棵子 树的遍历。
按根、左子树和右子树三部分进行遍历
• 方法
★ 先序遍历:先访问根结点,然后分别先序遍历左子树、 右子树
★ 特点:
» 叶子结点只可能在层次最大的两层上出现; » 对任一结点,若其右分支下子孙的最大层次为L,则
其左分支下子孙的最大层次必为L或L+1。
1
2
3
4
5
6
7
8 9 10 11 12 13 14 15

精品课件-数据结构-C语言描述-第6章

精品课件-数据结构-C语言描述-第6章
结点,结论成立。设当i=k时结论成立,即二叉树上至多有2k–1 个 结点, 则当i=k+1时,因为每个结点最多只有两个孩子,所以,第 k+1层上至多有2*2k –1 =2k个结点,性质成立。
第6章 树 性质2 高度为h的二叉树上至多有2h -1个结点。 当h=0时,二叉树为空二叉树。当h>0时,利用性质1,高度为h 的二叉树中结点的总数最多为
(6-2)
2h 1 - 1 < n≤2h - 1
移项得 (6-3)
2h 1 < n+1≤2h
取对数 (6-4)
h - 1 < lb(n+1)≤h
第6章 树
性质6 假定对一棵有n个结点的完全二叉树中的结点,按从 上到下、从左到右的顺序,从1到n编号(见图6-7),设树中某一 个结点的序号为i,1≤i≤n,则有以下关系成立:
第6章 树
图6-1描述了欧洲部分语言的谱系关系,它是一个后裔图, 图中使用的描述树形结构数据的形式为倒置的树形表示法。在前 几章中,我们学习了多种线性数据结构,但是一般来讲,这些数 据结构不适合表示如图6-1所示的层次结构的数据。为了表示这 类层次结构的数据,我们采用树形数据结构。在本章中我们将学 习多种不同特性的树形数据结构,如一般树、二叉树、穿线二叉 树、堆和哈夫曼树等。
第6章 树
Proto Indo-European 原始印欧语
Italic 古意大利语
… Latin 拉丁语
Hellenic 古希腊语
Greek 希腊语

Germanic 日尔曼语
North Germanic 北日尔曼语

West Germanic 西日尔曼语
Spanish French Italian 西班牙语 法语 意大利语
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数 据 结 构 第6章 树和二叉树第6章树和二叉树•树是一类重要的非线性数据结构,是以分支关系定义的层次结构6.1 树的定义和基本术语•树(tree)是n (n >0)个结点的有限集T ,在任一个非空的树中–有且仅有一个特定的结点,称为树的根(root)–当n >1时,其余结点可分为m (m >0)个互不相交的有限集 T 1,T 2,…,T m ,其中每一个集合本身又是一棵树,称为根的子树(subtree)AC D E FGH IJKLMB6.1 树的定义和基本术语•基本术语–结点(node)—表示树中的元素,包括数据项及若干指向其子树的分支–结点的度(degree)—结点拥有的子树数–叶子(leaf)—度为0的结点–孩子(child)—结点子树的根称为该结点的孩子–双亲(parents)—孩子结点的上层结点叫该结点的~–兄弟(sibling)—同一双亲的孩子–树的度—一棵树中最大的结点度数–结点的层次(level)—从根结点算起,根为第一层,它的孩子为第二层……–深度(depth)—树中结点的最大层次数–森林(forest)—m(m ≥ 0)棵互不相交的树的集合线性结构和树型结构的比较线性结构树型结构第一个数据元素(无前驱)根结点(无前驱)最后一个数据元素(无后继)多个叶子结点(无后继)其它数据元素(一个前驱、一个后继)其它数据元素(一个前驱、多个后继)6.2 二叉树•二叉树定义–二叉树是n(n ≥ 0)个结点的有限集,它或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。

•二叉树特点–每个结点至多有二棵子树(即不存在度大于2的结点)–二叉树的子树有左、右之分,且其次序不能任意颠倒6.2 二叉树•二叉树的基本形态AA B ABAB CΦ空二叉树只有根结点的二叉树右子树为空左子树为空左右子树均非空6.2 二叉树•二叉树性质1–在二叉树的第i 层上至多有2i-1个结点。

(i≥1)•证明:用归纳法证明之1.i=1时,只有一个根结点,2i-1 = 20 = 1;是对的2.假设对所有j(1 ≤j<i)命题成立,即第j层上至多有2j-1个结点,那么,第i-1层至多有2i-2个结点又二叉树每个结点的度至多为2,第i层上最大结点数是第i-1层的2倍,即2i-2 * 2 = 2i-1 故命题得证6.2 二叉树•二叉树性质2–深度为k的二叉树上至多含 2k-1 个结点(k≥1)。

–证明基于上一条性质,深度为k的二叉树上的结点数至多为20+21+ …+2k-1 = 2k-1 。

6.2 二叉树•二叉树性质3–对任何一棵二叉树,若它含有n 0 个叶子结点、n 2 个度为 2 的结点,则必存在关系式:n 0 = n 2+1。

–证明:设n 1 为二叉树中度为1的结点数,二叉树上结点总数 n = n 0 + n 1 + n 2 ,又二叉树上分支总数 b = n 1 +2 n 2 ,而 b = n -1 = n 0 + n 1 + n 2 - 1,由此, n 0 = n 2 + 1 。

6.2 二叉树•满二叉树–指的是深度为k 且含有2k -1个结点的二叉树。

–特点•每一层上的结点数都是最大结点数1231145891213671014156.2 二叉树•完全二叉树–深度为k ,有n 个结点的二叉树当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n 的结点一一对应。

–特点•叶子结点只可能在层次最大的两层上出现•对任一结点,若其右分支下子孙的最大层次为l ,则其左 分支下子孙的最大层次必为l 或l+11231145891267106.2 二叉树•二叉树性质4–具有 n 个结点的完全二叉树的深度为 +1– 证明设完全二叉树的深度为 k则根据第二条性质得 2k-1≤ n < 2k 即 k-1 ≤ log 2 n < k因为 k 只能是整数,因此, k =� + 1 。

2log n ⎢⎥⎣⎦2log n ⎢⎥⎣⎦6.2 二叉树•二叉树性质5–若对含 n个结点的完全二叉树从上到下且从左至右进行 1 至n 的编号,则对完全二叉树中任意一个编号为 i的结点:1.若i=1,则该结点是二叉树的根,无双亲,否则,编号为⎣i/2⎦的结点为其双亲结点;2.若2i>n,则该结点无左孩子,否则,编号为2i的结点为其左孩子结点;3.若 2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。

6.3 二叉树的存储结构•顺序存储结构–特点•结点间关系蕴含在其存储位置中•浪费空间,适于存满二叉树和完全二叉树#define MAX_TREE_SIZE 100 // 二叉树的最大结点数typedef TElemType SqBiTree[MAX_TREE_SIZE]; // 0号单元存储根结点SqBiTree bt;#define MAX_TREE_SIZE 100 // 二叉树的最大结点数typedef TElemType SqBiTree[MAX_TREE_SIZE]; // 0号单元存储根结点SqBiTree bt;–实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素二叉树的存储结构(顺序存储)12345678910a b c d e 0f gab cgde f6.3 二叉树的存储结构•二叉树的链式存储结构–– 二叉链表typedef struct _BiTNode { // 结点结构 TElemType data;struct _BiTNode *lchild, *rchild; // 左右孩子指针} BiTNode, *BiTree;typedef struct _BiTNode { // 结点结构 TElemType data; struct _BiTNode *lchild, *rchild; // 左右孩子指针} BiTNode, *BiTree;lchild data rchild二叉链表例A B CDE FG A BCD E FG^^^^^^^^在n个结点的二叉链表中,有n+1个空指针域Root6.3 二叉树的存储结构•二叉链表的性质–在n 个结点的二叉链表中,有n +1个空指针域–证明:设共有t 个空指针域n 个结点共有2n 个指针域所以,2n=t+n 1+2n 2而n=n 0+n 1+n 2t =2n 0+n 1=n 0+n 1+n 0=n 0+n 1+n 2+1=n +15.3 二叉树的存储结构•二叉树的链式存储结构—三叉链表typedef struct _TriTNode { // 结点结构 TElemType data;struct _TriTNode *lchild, *rchild;// 左右孩子指针struct _TriTNode *parent; //双亲指针} TriTNode, *TriTree;typedef struct _TriTNode { // 结点结构 TElemType data; struct _TriTNode *lchild, *rchild;// 左右孩子指针 struct _TriTNode *parent; //双亲指针 } TriTNode, *TriTree;lchild data rchildparent三叉链表例rootA B CDE FGAB C D EF G ^^^^^^^^^6.3 遍历二叉树和线索二叉树•问题的提出–顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。

•“访问”的含义可以很广,如:输出结点的信息等。

•“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。

而二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径遍历的问题。

6.3 遍历二叉树和线索二叉树•对“二叉树”而言,可以有三条搜索路径:–先上后下的按层次遍历;–先左(子树)后右(子树)的遍历;–先右(子树)后左(子树)的遍历。

6.3 遍历二叉树和线索二叉树•先(根)序的遍历算法–若二叉树为空树,则空操作;否则,•访问根结点•先序遍历左子树•先序遍历右子树。

// 采用递归算法void PreOrderTraverse(BiTree T, void (*visit)(TElemType &e)){if (T) {visit(T->data); // 访问结点 PreOrderTraverse(T->lchild, visit); // 遍历左子树 PreorderTraverse(T->rchild, visit);// 遍历右子树}}// 采用递归算法void PreOrderTraverse(BiTree T, void (*visit)(TElemType &e)){ if (T) { visit(T->data); // 访问结点 PreOrderTraverse(T->lchild, visit); // 遍历左子树 PreorderTraverse(T->rchild, visit);// 遍历右子树 }}6.3 遍历二叉树和线索二叉树•中(根)序的遍历算法–若二叉树为空树,则空操作;否则,•中序遍历左子树•访问根结点•中序遍历右子树。

// 采用递归算法void InOrderTraverse(BiTree T, void (*visit)(TElemType &e)){if (T) {InOrderTraverse(T->lchild, visit); // 遍历左子树 visit(T->data); // 访问结点 InOrderTraverse(T->rchild, visit);// 遍历右子树}}// 采用递归算法void InOrderTraverse(BiTree T, void (*visit)(TElemType &e)){ if (T) { InOrderTraverse(T->lchild, visit); // 遍历左子树 visit(T->data); // 访问结点 InOrderTraverse(T->rchild, visit);// 遍历右子树 }}6.3 遍历二叉树和线索二叉树•后(根)序的遍历算法–若二叉树为空树,则空操作;否则,•后序遍历左子树•后序遍历右子树。

•访问根结点// 采用递归算法void PostOrderTraverse(BiTree T, void (*visit)(TElemType &e)){if (T) {PostOrderTraverse(T->lchild, visit); // 遍历左子树 PostOrderTraverse(T->rchild, visit); // 遍历右子树 visit(T->data); // 访问结点}}// 采用递归算法void PostOrderTraverse(BiTree T, void (*visit)(TElemType &e)){ if (T) { PostOrderTraverse(T->lchild, visit); // 遍历左子树 PostOrderTraverse(T->rchild, visit); // 遍历右子树 visit(T->data); // 访问结点 }}例:利用先缀表达式建立表达式树•前缀表达式- + a * b – c d / e f-+/a*e fb-c d例 :利用前缀表达式建立表达式树Status CreateExpTree(BiTree &T){scanf(&ch);T = (BiTNode*) malloc(sizeof(BiTNode)) if (!T)exit(OVERFLOW); T->data = ch;if (ch >= ‘a’ && ch <= ‘z’) // 为操作数,建立为叶子结点 T->lchild = T->rchild = NULL; else { // 为运算符 CreateExpTree(T->lchild); // 构造左子树 CreateExpTree(T->rchild); // 构造右子树 }}Status CreateExpTree(BiTree &T){ scanf(&ch); T = (BiTNode*) malloc(sizeof(BiTNode)) if (!T) exit(OVERFLOW); T->data = ch; if (ch >= ‘a’ && ch <= ‘z’) // 为操作数,建立为叶子结点 T->lchild = T->rchild = NULL; else { // 为运算符 CreateExpTree(T->lchild); // 构造左子树 CreateExpTree(T->rchild); // 构造右子树 }}6.3 遍历二叉树和线索二叉树•遍历二叉树的结果是,求得结点的一个线性序列。

相关文档
最新文档