第5章 树和二叉树
数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
数据结构与算法系列研究五——树、⼆叉树、三叉树、平衡排序⼆叉树AVL树、⼆叉树、三叉树、平衡排序⼆叉树AVL⼀、树的定义树是计算机算法最重要的⾮线性结构。
树中每个数据元素⾄多有⼀个直接前驱,但可以有多个直接后继。
树是⼀种以分⽀关系定义的层次结构。
a.树是n(≥0)结点组成的有限集合。
{N.沃恩}(树是n(n≥1)个结点组成的有限集合。
{D.E.Knuth})在任意⼀棵⾮空树中:⑴有且仅有⼀个没有前驱的结点----根(root)。
⑵当n>1时,其余结点有且仅有⼀个直接前驱。
⑶所有结点都可以有0个或多个后继。
b. 树是n(n≥0)个结点组成的有限集合。
在任意⼀棵⾮空树中:⑴有⼀个特定的称为根(root)的结点。
⑵当n>1时,其余结点分为m(m≥0)个互不相交的⼦集T1,T2,…,Tm。
每个集合本⾝⼜是⼀棵树,并且称为根的⼦树(subtree)树的固有特性---递归性。
即⾮空树是由若⼲棵⼦树组成,⽽⼦树⼜可以由若⼲棵更⼩的⼦树组成。
树的基本操作1、InitTree(&T) 初始化2、DestroyTree(&T) 撤消树3、CreatTree(&T,F) 按F的定义⽣成树4、ClearTree(&T) 清除5、TreeEmpty(T) 判树空6、TreeDepth(T) 求树的深度7、Root(T) 返回根结点8、Parent(T,x) 返回结点 x 的双亲9、Child(T,x,i) 返回结点 x 的第i 个孩⼦10、InsertChild(&T,&p,i,x) 把 x 插⼊到 P的第i棵⼦树处11、DeleteChild(&T,&p,i) 删除结点P的第i棵⼦树12、traverse(T) 遍历树的结点:包含⼀个数据元素及若⼲指向⼦树的分⽀。
●结点的度: 结点拥有⼦树的数⽬●叶结点: 度为零的结点●分枝结点: 度⾮零的结点●树的度: 树中各结点度的最⼤值●孩⼦: 树中某个结点的⼦树的根●双亲: 结点的直接前驱●兄弟: 同⼀双亲的孩⼦互称兄弟●祖先: 从根结点到某结点j 路径上的所有结点(不包括指定结点)。
5(选讲)树和二叉树解析
树。所以树的定义是递归的 。
2018/10/13 8
2.树的基本术语
树的结点包含一个数据元素及若干指向其子树的分支。
1. 树的结点:包含一个DE和指向其子树的所有分支; 2. 结点的度:一个结点拥有的子树个数,度为零的结点称为叶结点; 3. 树的度:树中所有结点的度的最大值 Max(D(I)) 含义:树中最大分支数为树的度; 4. 结点的层次及树的深度:根为第一层,根的孩子为第二层,若某结 点为第k层,则其孩子为k+1层. 树中结点的最大层次称为树的深度或高度 5.森林:是m(m>=0)棵互不相的树的集合 森林与树概念相近,相互很容易转换. 6 .有序树、无序树 如果树中每棵子树从左向右的排列拥有一定的 顺序,不得互换,则称为有序树,否则称为无序树。
广度优先(按层次)遍历定义为:先访问第一层结点(即树根结点), 再从左至右访问第二层结点,依次按层访问 ……,直到树中结点全部被 访问为止。对图6-6 (a)中的树进行按层次遍历得到树的广度优先遍历序 列为:ABCDEFG。 说明: ① 前序遍历一棵树恰好等价于前序遍历该树所对应的二叉树。(6.2 节将介绍二叉树) ② 后序遍历树恰好等价于中序遍历该树所对应的二叉树。
2018/10/13 13
树的先序遍历算法描述如下: void Preorder(Btree *root) { if (root!=NULL) {printf(“%c\n”,root->data); //访问根结点 //先根遍历k叉树
for(i=0;i<k;i++)
preorder(root->t[i]); //递归前序遍历每一个子结点 }
祖父 家族关系表示: R={<祖父,伯父>,<祖父,父亲>,<祖父,叔父>, <伯父,堂兄>,<伯父,堂姐>,<父亲,本人>, <叔父,堂弟>,<堂兄,侄儿>}
《数据结构及其应用》笔记含答案 第五章_树和二叉树
第5章树和二叉树一、填空题1、指向结点前驱和后继的指针称为线索。
二、判断题1、二叉树是树的特殊形式。
()2、完全二叉树中,若一个结点没有左孩子,则它必是叶子。
()3、对于有N个结点的二叉树,其高度为。
()4、满二叉树一定是完全二叉树,反之未必。
()5、完全二叉树可采用顺序存储结构实现存储,非完全二叉树则不能。
()6、若一个结点是某二叉树子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。
()7、不使用递归也可实现二叉树的先序、中序和后序遍历。
()8、先序遍历二叉树的序列中,任何结点的子树的所有结点不一定跟在该结点之后。
()9、赫夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。
()110、在赫夫曼编码中,出现频率相同的字符编码长度也一定相同。
()三、单项选择题1、把一棵树转换为二叉树后,这棵二叉树的形态是(A)。
A.唯一的B.有多种C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子解释:因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的形态是唯一的。
2、由3个结点可以构造出多少种不同的二叉树?(D)A.2 B.3 C.4 D.5解释:五种情况如下:3、一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)。
A.250 B. 500 C.254 D.501解释:设度为0结点(叶子结点)个数为A,度为1的结点个数为B,度为2的结点个数为C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉树的性质可得B=0或1,又因为C为整数,所以B=0,C=500,A=501,即有501个叶子结点。
4、一个具有1025个结点的二叉树的高h为(C)。
A.11 B.10 C.11至1025之间 D.10至1024之间解释:若每层仅有一个结点,则树高h为1025;且其最小树高为⎣log21025⎦ + 1=11,即h在11至1025之间。
数据结构第5章课件 中国石油大学(华东)
二叉链表
leftChild
data rightChild
22
二叉树的链表表示(三叉链表)
每个结点增加一个指向双亲的指针parent,使 得查找双亲也很方便。
leftChild data parent rightChild
三叉链表
data
leftChild
27
BinTreeNode *LeftChild (BinTreeNode *current ) { return (current != NULL )? current->leftChild :NULL; } BinTreeNode *RightChild (BinTreeNode *current ) { return ( current!= NULL) ? current->rightChild : NULL; } int Height( ){return Height(root);} int Size( ){return Size(root);} BinTreeNode *GetRoot ( ) const { return root; } void preOrder( ) {preOrder(root);} //前序遍历 void inOrder( ) {inOrder(root);} //中序遍历 void postOrder( ) {postOrder(root);} //后序遍历 void levelOrder( ) ; // 不需要递归,所以直接对外接 口调用即可。层序遍历 28
b
f
c
d
g
6
e
a
b.嵌套集合表示法: b 根据树的集合定义,写出集合划分。 { a, {b,{e},{f}}, {c}, {d,{g}} } e c d
第5章 树与二叉树习题参考答案【VIP专享】
2. 一棵具有 n 个结点的二叉树,其深度最多为 n ,最少为 [log2n]+1 。 3. 一棵具有 100 个结点的完全二叉树,其叶结点的个数为 50 。37 4. 以{5,9,12,13,20,30}为叶结点的权值所构造的哈夫曼树的带权路径长度是 217
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,通系电1,力过根保管据护线生高0不产中仅工资2艺料22高试2可中卷以资配解料置决试技吊卷术顶要是层求指配,机置对组不电在规气进范设行高备继中进电资行保料空护试载高卷与中问带资题负料2荷试2,下卷而高总且中体可资配保料置障试时2卷,32调需3各控要类试在管验最路;大习对限题设度到备内位进来。行确在调保管整机路使组敷其高设在中过正资程常料1工试中况卷,下安要与全加过,强度并看工且25作尽52下可22都能护可地1关以缩于正小管常故路工障高作高中;中资对资料于料试继试卷电卷连保破接护坏管进范口行围处整,理核或高对者中定对资值某料,些试审异卷核常弯与高扁校中度对资固图料定纸试盒,卷位编工置写况.复进保杂行护设自层备动防与处腐装理跨置,接高尤地中其线资要弯料避曲试免半卷错径调误标试高方中等案资,,料要编试求5写、卷技重电保术要气护交设设装底备备置。4高调、动管中试电作线资高气,敷料中课并设3试资件且、技卷料中拒管术试试调绝路中验卷试动敷包方技作设含案术,技线以来术槽及避、系免管统不架启必等动要多方高项案中方;资式对料,整试为套卷解启突决动然高过停中程机语中。文高因电中此气资,课料电件试力中卷高管电中壁气资薄设料、备试接进卷口行保不调护严试装等工置问作调题并试,且技合进术理行,利过要用关求管运电线行力敷高保设中护技资装术料置。试做线卷到缆技准敷术确设指灵原导活则。。:对对在于于分调差线试动盒过保处程护,中装当高置不中高同资中电料资压试料回卷试路技卷交术调叉问试时题技,,术应作是采为指用调发金试电属人机隔员一板,变进需压行要器隔在组开事在处前发理掌生;握内同图部一纸故线资障槽料时内、,设需强备要电制进回造行路厂外须家部同出电时具源切高高断中中习资资题料料电试试源卷卷,试切线验除缆报从敷告而设与采完相用毕关高,技中要术资进资料行料试检,卷查并主和且要检了保测解护处现装理场置。设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
第五章二叉树
树为空
树为空
根的左右子 树都不空
二、二叉树的性质
第1层(根) 第2层 第3层
第4层
1、若层次从1开始,则第i层最多有2 i-1个结点 2、高度为h的二叉树最多有2h -1个结点 3、任何一棵二叉树,若叶子结点数为n0,度为2的结点数 为n2,则n0 = n2 + 1
5.2.2 二叉树的性质
二叉树具有下列重要性质: 性质1: 在二叉树的第i层上至多有2i-1个结点(i>=1)。
二叉树的二叉链表存储表示
Elem val(){return data;} void setVal(const Elem e){data=e;} inline BinTreeNode<Elem>* left(){return lchild;} inline BinTreeNode<Elem>* right(){return rchild;} void setLeft(BinTreeNode<Elem>* left){lchild=left;} void setRight(BinTreeNode<Elem>* right){rchild=right;} bool isLeaf()
Elem data; BinTreeNode * lchild; BinTreeNode * rchild; public:
BinTreeNode(){lchild=rchild=NULL;} BinTreeNode(Elem e,BinNodePtr*l=NULL,
BinNodePtr*r=NULL) {data=e; lchild=l; rchild=r;} ~BinTreeNode(){}
n0,度为2的结点数为n2,则n0=n2+1。
《数据结构与算法设计》第5章 树
5.2.2 二叉树的性质
➢ 满二叉树和完全二叉树
满二叉树是指深度为h且节点数取得最大值2h-1的二叉树。 如果一棵深度为h的二叉树,除第h层外,其他每层的节点数 都达到最大,且最后一层的节点自左而右连续分布,这样的二 叉树称为完全二叉树。
5.2.2 二叉树的性质
5.2.2 二叉树的性质
性质6 对含有n个节点的完全二叉树自上而下、同一层从左往右 对节点编号0,1,2,…,n-1,则节点之间存在以下关系: (1)若i=0,则节点i是根节点,无双亲;若i>0,则其双亲节 点的编号为i/2-1; (2)若2×i +1≤n,则i的左孩子编号为2×i+1; (3)若2×i+2≤n,则i的右孩子编号为2×i+2; (4)若i>1且为偶数,则节点i是其双亲的右孩子,且有编号为 i-1的左兄弟; (5)若i<n-1且为奇数,则节点i是其双亲的左孩子,且有编号 为i+1的右兄弟。
5.3.3 二叉树的二叉链表类模板定义
//根据二叉树的先序遍历序列和中序遍历序列创建以r为根的二叉树
void CreateBinaryTree(BTNode<DataType> * &r, DataType pre[], DataType
in[], int preStart, int preEnd, int inStart, int inEnd); int Height(BTNode<DataType> *r); //求以r为根的二叉树高度 //求以r为根的二叉树中叶子节点数目
5.1.2 树的术语
(9)节点的层次:从根节点开始,根为第一层,根的孩子为 第二层,根的孩子的孩子为第三层,依次类推,树中任一节 点所在的层次是其双亲节点所在的层次数加1。 (10)堂兄弟:双亲在同一层的节点互为堂兄弟。
第5章+树与二叉树习题解析(答)
习题五树与二叉树一、选择题1、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足。
A、所有的结点均无左孩子B、所有的结点均无右孩子C、只有一个叶子结点D、是任意一棵二叉树2、一棵完全二叉树上有1001个结点,其中叶子结点的个数是。
A、250B、500C、254D、505E、以上答案都不对3、以下说法正确的是。
A、若一个树叶是某二叉树前序遍历序列中的最后一个结点,则它必是该子树后序遍历序列中的最后一个结点B、若一个树叶是某二叉树前序遍历序列中的最后一个结点,则它必是该子树中序遍历序列中的最后一个结点C、在二叉树中,具有两个子女的父结点,在中序遍历序列中,它的后继结点最多只能有一个子女结点D、在二叉树中,具有一个子女的父结点,在中序遍历序列中,它没有后继子女结点4、以下说法错误的是。
A、哈夫曼树是带权路径长度最短得数,路径上权值较大的结点离根较近B、若一个二叉树的树叶是某子树中序遍历序列中的第一个结点,则它必是该子树后序遍历序列中的第一个结点C、已知二叉树的前序遍历和后序遍历并不能唯一地确定这棵树,因为不知道树的根结点是哪一个D、在前序遍历二叉树的序列中,任何结点其子树的所有结点都是直接跟在该结点之后的5、一棵有124个叶结点的完全二叉树,最多有个结点。
A、247B、248C、249D、250E、2516、任何一棵二叉树的叶结点在前(先)序、中序和后序遍历序列中的相对次序。
A、不发生变化B、发生变化C、不能确定7、设a、b为一棵二叉树上的两个结点。
在中序遍历时,a在b前面的条件是。
A、a在b的右方B、a在b的左方C、a是b的祖先D、a 是b的子孙8、设深度为k的二叉树上只有度为0和度为2的结点,则这类二叉树上所含的结点总数为。
A、不确定B、2kC、2k-1D、2k+19、设有13个值,用它们组成一棵哈夫曼树,则该哈夫曼树共有个结点。
A、13B、12C、26 D、2510、下面几个符号串编码集合中,不是前缀编码的是。
05二叉树
}
if (Parent->Lchild == NULL) /* Parent所指结点左子树为空 */ Parent->Lchild = ptr;
else
{
/* Parent所指结点左子树非空 */
ptr->Lchild = Parent->Lchild;
Parent->Lchild = ptr;
}
二叉树可以是空的,空二叉树没有任何结 点; 二叉树上的每个结点最多可以有两棵子树, 这两棵子树是不相交的; 二叉树上一个结点的两棵子树有左、右之 分,次序是不能颠倒的。
图5-2 两棵不同的二叉树
从二叉树中的一个结点往下,到达它的 某个子、孙结点时所经由的路线,称为一条 “路径”。对于路径来说,从开始结点到终 止结点,中间经过的结点个数,称为路径的 “长度”。从根结点开始、到某个结点的路 径长度,称为该结点的“深度”。
一棵一般的二叉树,是由如下的3类结点组成的: 根结点——二叉树的起始结点; 分支(或内部结点)——至少有一个非空子树 (即度为1或2)的结点 叶结点——没有非空子树(即度为0)的结点。 有两种特殊的二叉树:满二叉树和完全二叉树。
所谓“满二叉树”,是指该二叉树的每 一个结点,或是有两个非空子树的结点,或 是叶结点,且每层都必须含有最多的结点个 数。
性质5-2 树高为k(k≥0)的二叉树, 最多有2k+1−1个结点。 【证明】由性质5-1可知,在树高为k的 二叉树里,第0层有20个结点,第1层有21个 结点,第2层有22个结点,„„,第k层有2k 个结点。因此,要求出树高为k的二叉树的 结点个数,就是求和:
20 + 21 + 22 +„+ 2k
数据结构与算法第5章课后答案
page: 1The Home of jetmambo - 第 5 章树和二叉树第 5 章树和二叉树(1970-01-01) -第 5 章树和二叉树课后习题讲解1. 填空题⑴树是n(n≥0)结点的有限集合,在一棵非空树中,有()个根结点,其余的结点分成m (m>0)个()的集合,每个集合都是根结点的子树。
【解答】有且仅有一个,互不相交⑵树中某结点的子树的个数称为该结点的(),子树的根结点称为该结点的(),该结点称为其子树根结点的()。
【解答】度,孩子,双亲⑶一棵二叉树的第i(i≥1)层最多有()个结点;一棵有n(n>0)个结点的满二叉树共有()个叶子结点和()个非终端结点。
【解答】2i-1,(n+1)/2,(n-1)/2【分析】设满二叉树中叶子结点的个数为n0,度为2的结点个数为n2,由于满二叉树中不存在度为1的结点,所以n=n0+n2;由二叉树的性质n0=n2+1,得n0=(n+1)/2,n2=(n-1)/2。
⑷设高度为h的二叉树上只有度为0和度为2的结点,该二叉树的结点数可能达到的最大值是(),最小值是()。
【解答】2h -1,2h-1【分析】最小结点个数的情况是第1层有1个结点,其他层上都只有2个结点。
⑸深度为k的二叉树中,所含叶子的个数最多为()。
【解答】2k-1【分析】在满二叉树中叶子结点的个数达到最多。
⑹具有100个结点的完全二叉树的叶子结点数为()。
【解答】50【分析】100个结点的完全二叉树中最后一个结点的编号为100,其双亲即最后一个分支结点的编号为50,也就是说,从编号51开始均为叶子。
⑺已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点。
则该树中有()个叶子结点。
【解答】12【分析】根据二叉树性质3的证明过程,有n0=n2+2n3+1(n0、n2、n3分别为叶子结点、度为2的结点和度为3的结点的个数)。
⑻某二叉树的前序遍历序列是ABCDEFG,中序遍历序列是CBDAFGE,则其后序遍历序列是()。
第5章 树和二叉树
B A
C
D
E
F
G
H
I
J
K
L
T1
T2
M
2015年10月20日
T3
树的其它表示方式
A D K L F C G E B H M J I
A
A B E K L F C G
B C D
嵌套集合
E
D H M
F
G
H
I
J
I J
K
L
M
凹入表示
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
广义表
2015年10月20日
北京林业大学信息学院
2015年10月20日
二叉树的链式存储
PARENT
lchild
data
rchild
DATA
lchild
data
parent rchild
LCHILD
RCHILD
北京林业大学信息学院
2015年10月20日
二叉链表
A A ^ B D lchild data rchild
B
C
E
G
F
二叉树的五种不同形态
2015年10月20日
练习
具有3个结点的二叉树可能有几种不同形态?普通树呢? 5种/2种
2015年10月20日
二叉树的抽象数据类型定义
ADT BinaryTree{ 数据对象D: D是具有相同特性的数据元素的集合。 数据关系R: 若D=Φ,则R= Φ ; 若D≠Φ,则R= {H};存在二元关系: ① root 唯一 //关于根的说明 ② Dj∩Dk= Φ //关于子树不相交的说明 ③ …… //关于数据元素的说明 ④ …… //关于左子树和右子树的说明 //至少有20个 基本操作 P: }ADT BinaryTree
第五章习题
三、填空题
9. n个结点的各棵树中,其深度最小的那棵树的深度 是 2 。它共有 n-1 个叶子结点和 1 个非叶子结点, 其中,深度最大的那棵树的深度是 n ,它共有 1 个 叶子结点和 n-1 个非叶子结点。
10.先根遍历树林正好等同于 先序 遍历对应的二叉树,后 根遍历树林正好等同于按 中序 遍历对应的二叉树。 11.若一个二叉树的叶子结点是某子树的中序遍历序列中的 前序 最后一个结点,则它必是该子树的______序列中的最后一个 结点。
C,E,F,G,
二、判断题
× 1.二叉树是度为2的有序树。
× 2. 完全二叉树一定存在度为1的结点。 √
√
3.深度为K的二叉树中结点总数≤2k-1。 4. 一个树的叶结点,在前序遍历和后序遍历 下,皆以相同的相对位置出现。 但是,如果我们还知道该树的根结点是哪一个, 则可以确定这棵二叉树。 一个栈。
C A
10.深度为h的满m叉树的第k层有( )个结 点。(1=<k=<h) A.mk-1 B.mk-1 C.mh-1 D.mh-1
一、选择题
11.高度为 K的二叉树最大的结点数为( A.2k B.2k-1 C.2k -1 D.2k-1-1 12. 一棵树高为K的完全二叉树至少有( A.2k –1 B. 2k-1 –1 C. 2k-1 D. 2k )。
第五章 树和二叉树
习题讨论
、选择题
1.已知一算术表达式的中缀形式为 A+B*C-D/E,后缀形式 为ABC*+DE/-,其前缀形式为( ) A.-A+B*C/DE B. -A+B*CD/E C.-+*ABC/DE D. -+A*BC/DE
D
C
2. 设有一表示算术表达式的二叉树(见下图),它所表示的算 术表达式是( ) A. A*B+C/(D*E)+(F-G) / B. (A*B+C)/(D*E)+(F-G) + + C * C. (A*B+C)/(D*E+(F-G)) * D E F G D. A*B+C/D*E+F-G A B
树结构习题及答案
第5章树【例5-1】写出如图5-1所示的树的叶子结点、非终端结点、每个结点的度及树深度。
AB C D EF G H I J图5-1解:(1)叶子结点有:B、D、F、G、H、I、J。
(2)非终端结点有:A、C、E。
(3)每个结点的度分别是:A的度为4,C的度为2,E的度为3,其余结点的度为0。
(4)树的深度为3。
【例5-2】一棵度为2的树与一棵二叉树有什么区别?解:度为2的树有两个分支,但分支没有左右之分;一棵二叉树也有两个分支,但有左右之分,左右子树的次序不能交换。
【例5-3】树与二叉树有什么区别?解:区别有两点:(1)二叉树的一个结点至多有两个子树,树则不然;(2)二叉树的一个结点的子树有左右之分,而树的子树没有次序。
【例5-4】分别画出具有3个结点的树和三个结点的二叉树的所有不同形态。
解:如图5-2(a)所示,具有3个结点的树有两种不同形态。
图5-2(a)如图5-2(B)所示,具有3个结点的二叉树有以下五种不同形态。
图5-2(b)【例5-5】如图5-3所示的二叉树,试分别写出它的顺序表示和链接表示(二叉链表)。
解:(1)顺序表示。
(2)该二叉树的二叉链表表示如图5-4所示。
【例5-6】试找出满足下列条件的所有二叉树:(1)先序序列和中序序列相同; (2)中序序列和后序序列相同; (3)先序序列和后序序列相同。
解:(1)先序序列和中序序列相同的二叉树为:空树或者任一结点均无左孩子的非空二叉树;(2)中序序列和后序序列相同的二叉树为:空树或者任一结点均无右孩子的非空二叉树;(3)先序序列和后序序列相同的二叉树为:空树或仅有一个结点的二叉树。
【例5-7】如图5-5所示的二叉树,要求:(1)写出按先序、中序、后序遍历得到的结点序列。
(2)画出该二叉树的后序线索二叉树。
解: (1) 先序遍历序列:ABDEFC 中序遍历序列:DEFBAC 后序遍历序列:FEDBCA (2)其后序线索二叉树如图5-6所示。
数据结构5树资料
3.树的术语:
结点(node)
数据元素。
结点的度(degree)
结点的子树个数。
树中所有结点度的最大值。 度不为0的结点。 度为0的结点。 某结点子树的根结点。
树的度(degree) 分支(branch)结点
叶(leaf)结点 孩子(child)结点
2018/10/13 第5章 树和二叉树
同构型
19/112
A
异构型
B
C
D
E
F
G
H
I
J
孩子表示法-- c语言描述 (同构型)
typedef struct TreeNode
{ DataType data;
struct TreeNdoe *Son[MAXSON];
} nodetype;
2018/10/13 第5章 树和二叉树 20/112
a b d i e j f c g h
2018/10/13
第5章 树和二叉树
2/112
除根以外的其它结点划分为m (m 0)个互不相交 的有限集合T0, T1, …, Tm-1,每个集合又是一棵树, 并且称之为根的子树(SubTree)。
每棵子树的根结点有且仅有一个直接前驱,但可 以有0个或多个直接后继。
B E F C G H D I J
E,F,B,G,C,H,I,J, D,A
第5章 树和二叉树 26/112
2018/10/13
3.层序遍历
按层次顺序(1,2,…)遍历,同一层按从左 到右的顺序。
A B E F C G H D I J
遍历序列: A,B,C,D,E,F,G,H,I,J
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if ( n == 0 ) return 1;//基本项
else return n * Factorial (n-1); //归纳项} 则三种遍历算法可写出:
2016年10月20日
先序遍历算法
Status PreOrderTraverse(BiTree T){ if(T==NULL) return OK; //空二叉树 else{ cout<<T->data; //访问根结点 PreOrderTraverse(T->lchild); //递归遍历左子树 PreOrderTraverse(T->rchild); //递归遍历右子树 } }
2016年10月20日
性质4: 具有n个结点的完全二叉树的深度必为[log2n]+1
1 2 4 8 9 10 5 11 12 6 3 7
k-1层
2 k 1 1 2k 1
k
k层
k 1
n
2
1 n 2 1
2016年10月20日
性质5: 对完全二叉树,若从上至下、从左至右编号,
则编号为i 的结点,其左孩子编号必为2i,其右孩子编 号必为2i+1;其双亲的编号必为i/2。
预习任务(200经验值)
1.二叉树的存储方法有哪几种? 链式存储结构(二叉、三叉链表) 2.什么叫二叉树的遍历?
按某条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次, 而且仅被访问一次。 顺序存储结构(完全二叉树)
3.先左后右的二叉树遍历算法有哪几种?
先序遍历、中序遍历、后序遍历
4.如何用算法求二叉树的叶子结点个数?
2016年10月20日
二叉树的性质
性质1: 在二叉树的第i层上至多有2i-1个结点 提问:第i层上至少有
1
个结点?
性质2: 深度为k的二叉树至多有2k-1个结点 提问:深度为k时至少有
k
个结点?
2016年10月20日
性质3: 对于任何一棵二叉树,若2度的结点数有n2 个,则叶子数n0必定为n2+1 (即n0=n2+1)
2016年10月20日
树的其它表示方式
A D K L F C G E B H M J I
A
A B E K L F C G
B C D
嵌套集合
E
D H M
F
G
H
I
J
I J
K
L
M
凹入表示
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
广义表
2016年10月20日
基本术语
根 ——即根结点(没有前驱) 叶子 ——即终端结点(没有后继) 森林 ——指m棵不相交的树的集合(例如删除A后的子树个数) 有序树 ——结点各子树从左至右有序,不能互换(左为第一) 无序树 ——结点各子树可互换位置。
1 2 4 8 9 10 5 11 12 6 3 7
2016年10月20日
进阶任务 (完成每任务加经验值100)
请把下面名词术语翻译成英文,并大声读与拼写 出来: 树 tree 子树 Subtree 树根 Root 结点 Node 叶子 Leaf 度 Degree 双亲 Parents 孩子 Children 兄弟 Brothers 深度Depth 有序树 Ordered tree 无序树 Unordered tree Binary tree 森林 Forest 二叉树 In-order traversal 遍历 Traverse 中序遍历 先序遍历 preorder traversal 后序遍历 Postorder traversal 层次遍历level traversal 线索二叉树 threaded binary tree 最优树 Optimal tree 前缀编码 Prefix code
解:设 树上结点总数 n = n0 + nk 又树上分支总数 b = k*nk 而 b = n-1 由此, n0 =n-(n-1)/k
特殊形态的二叉树
1 2 4 8 9 10 5 11 12 6 13 14 3 7 15 8
只有最后一层叶子不 1 满,且全部集中在左 边
2 4 9 10 5 11 12 6 3 7
1 2 4 8 9 10 5 11 12 6 3 7 8 4 9 10 2 5 11 12 6 1 3 7
B n 1
B n2 2 n1 1
n n2 2 n1 1 1 n2 n1 n0
2016年10月20日
课堂任务(200经验值)
树T有n个结点且结点的度均为k或者0, n-(n-1)/k 则树中的叶子结点总数为______________ 。
1 2 4 8 9 10 5 11 12 6 13 14 3 7 15 8 4 9 10 2 5 11 12 6 1 3 7
2016年10月20日
课堂任务(200经验值)
已知一棵完全二叉树共有748个结点 374 个叶子结点。 ,则该树中有_______
解:根据二叉树性质4,可知该完全二叉树高度为: H= log2n +1= log2748 +1= 10 由性质2,前9层共有结点数:29-1=511
^ ^
^ C ^
^
E
D
^ ^ G
F
^
G
^
typedef struct TriTNode { TelemType data; struct TriTNode *lchild,*parent,*rchild; }TriTNode,*TriTree;
2016年10月20日
5.3 遍历二叉树和线索二叉树
遍历定义——指按某条搜索路线遍访每个结点且 不重复(又称周游)。 遍历用途——它是树结构插入、删除、修改、查 找和排序运算的前提,是二叉树一 切运算的基础和核心。
A
1
D
B
C
2
J
E
F
G
H
I
3 4
K
L
M
多叉树)若不转化为二叉树,则运算很难实现 为何要重点研究每结点最多只有两个 “叉” 的树? 二叉树的结构最简单,规律性最强; 可以证明,所有树都能转为唯一对应的二叉树。
2016年10月20日
二叉树基本特点:
•结点的度小于等于2 •有序树(子树有序,不能颠倒)
A
B
C
D
E
F
G
H
I
J
K
L
M
2016年10月20日
基本术语
双亲 ——即上层的那个结点(直接前驱) 孩子 ——即下层结点的子树的根(直接后继) 兄弟 ——同一双亲下的同层结点(孩子之间互称兄弟) 堂兄弟 ——即双亲位于同一层的结点(但并非同一双亲) 祖先 ——即从根到该结点所经分支的所有结点 子孙 ——即该结点下层子树中的任一结点
先序(或中序或后序)遍历二叉树,在遍历过程中“访问结点”的操作 改为查找叶子结点(左右孩子均为空的结点),并计数。
二叉树的顺序存储
实现:按满二叉树的结点层次编号,依次存放二叉 树中的数据元素。
2016年10月20日
二叉树的顺序存储
0 1 2 3 4 5 6 7 8 9 10 a b c d e 0 0 0 0 f g
LRD—后序遍历,即先左再右再根
2016年10月20日
用二叉树表示算术表达式
+
* E D C B
先序遍历 +**/AB C DE 前缀表示 中序遍历 A/B*C*D +E 中缀表示
后序遍历 AB/C *D *E+ 后缀表示 层序遍历 +*E*D/CAB
2016年10月20日
*
/ A
遍历的算法实现-先序遍历
分析:必有 2n 个链域。除根结 点外,每个结点有且仅有一个 双亲,所以只会有 n - 1 个结点 的链域存放指针,指向非空子 女结点。
空指针数目=2n-(n-1)=n+1
A ^ B
^ C ^
D
^ E
^ F ^ ^ G ^
2016年10月20日
三叉链表
lchild data parent rchild A B C E D F B A
A
B
C
D
E
F
G
H
I
J
K
L
M
2016年10月20日
基本术语
结点 ——即树的数据元素 结点的度——结点挂接的子树数 结点的层次 ——从根到该结点的层数(根结点算第一层) 终端结点 ——即度为0的结点,即叶子 分支结点 ——即度不为0的结点(也称为内部结点) 树的度 ——所有结点度中的最大值 树的深度——指所有结点中最大的层数 (或高度) 层次
^ C ^
D
G
^ E
^ F ^ ^ G ^
typedef struct BiNode{ TElemType data; struct BiNode *lchild,*rchild; //左右孩子指针 }BiNode,*BiTree;
2016年10月20日
课堂任务(200经验值)
在n个结点的二叉链表中,有 n+1 个空指针域
二叉树的五种不同形态
2016年10月20日
课堂练习(经验值200)
具有3个结点的二叉树可能有几种不同形态?普通树呢? 5种/2种
2016年10月20日
二叉树的抽象数据类型定义
ADT BinaryTree{ 数据对象D: D是具有相同特性的数据元素的集合。 数据关系R: 若D=Φ,则R= Φ ; 若D≠Φ,则R= {H};存在二元关系: ① root 唯一 //关于根的说明 ② Dl∩Dr= Φ //关于子树不相交的说明 ③ …… //关于数据元素的说明 ④ …… //关于左子树和右子树的说明 ……//至少有20个 基本操作 P: }ADT BinaryTree