✅ 操作成功!

数据结构ppt

发布时间:2023-06-05 作者:admin 来源:文学

数据结构ppt

数据结构ppt

列车运行图调整-音箱系统

2023年2月17日发(作者:猪靥)

第13页

数据结构第6章树和二叉树.ppt

1、第六章树和二叉树6.1树的类型定义6.2二叉树的类型定义和实现6.3

遍历二叉树和线索二叉树6.4树和森林6.5Huffman树与Huffman编码1对比树

型结构和线性结构的结构特点第一个数据元素(无前驱)最终一个数据元素(无后

继)其它数据元素(一个前驱、一个后继)根结点(无前驱)多个叶子结点(无后继)

其它数据元素(一个前驱、多个后继)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~26.1树的

类型定义树是n(n≥0)个结点的有限集D,当n≥1时:1〕有一个特定的结点root

被称为根(结点);2〕除根以外的结点被分成m(m≥0)个不相交的有限集

T1,T2,……,Tm,其中每个集合又是一棵树,称为根的子树。ABCDEFGHIJMKL3任

何一棵非空树是一个二元组Tree=〔roo

2、t,F〕其中:root被称为根结点F被称为子树森林森林和树之间的联系:

一棵树去掉根后,其子树构成一个森林;一个森林增加一个根结点成为树。森林:

是m〔m≥0〕棵互不相交的树的集合。4定义或为空树,或是由一个根结点和两

棵互不相交的左子树、右子树构成,并且左、右子树本身也是二叉树。特性二叉

树中每个结点最多有两棵子树;二叉树每个结点的度小于等于2子树有左右之分,

不能颠倒——有序树二叉树是递归结构,在二叉树的定义中又用到了二叉树的概

念6.2二叉树的类型定义和实现5性质1在二叉树的第i层上至多有2i-1个结

点。(i≥1)二叉树的重要特性性质2深度为k的二叉树上至多含2k-1个结点(k≥1)

性质3对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必

存在关系式:n0=n2+1。性质4具有

3、n个结点的完全二叉树的深度为log2n+16满二叉树:深度为k,且有

2k-1个结点的二叉树;特点:每一层上的结点数都是最大数目。结点层序编号方

法:从根结点起自上而下逐层〔层内自左至右〕对二叉树的结点进行连续编号。

1367101415两类特别的二叉树:7完全二叉树:一棵深度为k有n

个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至

n的结点一一对应时,称之为完全二叉树。特点:叶子结点只可能在层次数最大

的两层上出现。只有最下一层的结点数可能未到达最大值。对任一结点,假如其

右子树的最大层次为L,则其左子树的最大层次为L或L+1。完全二叉树结点数

2k-1-1n,则该结点无左孩子,否则,编号为2i的结点为其左孩子结点;(3)若

2i+1n,则该结

4、点无右孩子结点,否则,编号为2i+1的结点为其右孩子结点。9证明:

先证⑵⑶,然后证⑴。证⑵⑶,用归纳法;当i=1时,即i为根结点,若2i存

在,即2存在,2为1的左孩子;若2i+1存在,即3存在,3为1的右孩子;结

论成立;假设当i=j时,结论成立;LChild(j)=2j;RChild(j)=2j+1;当i=j+1时,

依据完全二叉树的结构特点,j+1的左孩子应为j的右孩子的下一个结点,即

LChild(j+1)=RChild(j)+1=(2j+1)+1=2(j+1)RChild(j+1)=LChild(j+1)+1=2(j+

1)+1;结论成立;10下面证⑴:当i=1时,即1为根,无双亲;当i≠1时,假设

k为其双亲,即i为k的孩子;①假如i为k的左孩子,即i=2k,i为偶数,k=i/2,

即k

5、=i/2②假如i为k的右孩子,即i=2k+1,i为奇数,k=(i-1)/2,即

k=i/2故结论成立;证明〔续〕:11Q5:设一棵完全二叉树有700个结点,则

共有个叶子结点。答案:总层数k=log2700+1=10;//〔29〕=512且前9层

总结点数为29-1=511因此,末层叶子数为700-511=189个。末层的189个叶子

只占据了上层的95个结点(189/2),上层(k=9)右边的0度结点数还有

第14页

29-1-95=161个!所以,全部叶子数=189(末层)+161(k-1层)=350个。35012

另一法:可先求2度结点数,再由此得到叶子总数。首先,前k-2层的28-1〔255〕

个结点确定都是2度的〔完全二叉树〕另外,末层叶子〔刚刚已求出为189〕所

对应的双亲也是度=2

6、,〔共有189/2=94个〕。所以全部2度结点数为255(k-2层)+94(k-1

层)=349个;总叶子数=2度结点数+1=350个。13Q5:设一棵完全二叉树有700

个结点,则共有个叶子结点。答:最快方法:总叶子数=n/2=

350350∵n=n0+n1+n2由公式n0=n2+1n=n0+n1+(n0-1)=2n0+n1-1n0=(n+1-n1)/2

又∵n1=1或n1=0,故n0=n/2或n0=(n+1)/2因n和n0都为整数,所以

n0=n/214Q6:一棵有124个叶子结点的完全二叉树,最多有个结点。答:由

n0=n2+1可知:n2=123;前6层有26-1=63个度为2的结点;第7层有123-63=60

个度为2的结点,则第8层对应有60*2=120个叶子结点;第7层总共2

7、7-1=64个结点,剩余64-60=4个非2度结点;若有1个度为1的结点,

总结点数为124+1+123=248若有0个度为1的结点,总结点数为124+0+123=247

所以,最多有248个结点。24815Q6:一棵有124个叶子结点的完全二叉树,最多

有个结点。答:由n0=n2+1可知:n2=123;n=n0+n1+n2=247+n1在完全二叉树中,

n1=0或n1=1;所以n的最大值为247+1=24824816#defineMAX_TREE_SIZE100//

二叉树的最大结点数typedefTElemTypeSqBiTree[MAX_TREE_SIZE];//0号单元存

储根结点SqBiTreebt;1.二叉树的顺序存储表示根据依次自上而下、自左至右的

顺序,存储完全。省略部分。(n1)n!=1(n=0,1)递归函数的定义都应包括两部分:

1.递归终止的条件,即对无需递归的最小问题的处理方法;2.将一般问题简化成

一个或多个规模较小的相同性质的问题,递归地调用同样的方法求解这些问题,

使这些问题最终到达递归终止。

33voidPreorder(BiTreeT,void(*visit)(TElemTypee)){//先序遍历二叉树

if(T){//递归终止条件(*visit)(T-data);//访问结点

Preorder(T-lchild,visit);//遍历左子树Preorder(T-rchild,visit);//遍历

右子树}}//Preorder算法的递归描述:二叉树算法实现基于二叉链表存储结构

34先序遍历非递归算法需要设置一个栈结

9、构,用以保存指向结点的指针,以便在遍历某结点的左子树之后,由该

指针找到该结点的右子树。算法思想从二叉树的根结点开始,令指针变量p指向

根结点,1)访问当前结点p,并将p压入栈中,然后令p指向它当前指向结点的

左孩子结点。2)若p不为空,重复执行第1)步,否则执行第3步;3)从栈中弹出

栈顶元素赋给指针变量p,并令p指向它当前指向结点的右孩子结点。4)重复以

上3步,直到p为空,并且栈也为空时结束。

35voidPreorder(BiTreeT,void(*visit)(TElemTypee)){//先序遍历二叉树

InitStack(S);p=T;while(p||!StackEmpty(S)){if(p){//往左子树方向前进

(*visit)(p-data);Push(S,p)

10、;p=p-lchild;}else{//从左子树退回

Pop(S,p);p=p-rchild;}}//while}//Preorder算法的非递归描述:二叉树算法实

现基于二叉链表存储结构36若二叉树为空树,则空操作;否则,⑴中序遍历左

子树;⑵访问根结点;⑶中序遍历右子树。中(根)序的遍历算法:访问路径描述:

沿着左子树方向找到最“左边”的结点作为起点,从左子树退回时依次访问每个

结点及其右子树。中序遍历序列:

D,B,G,E,A,C,FAFGEDCB37voidInorder(BiTreeT,void(*visit)(TElemTypee)){/

第15页

/中序遍历二叉树if(T){Inorder(T-lchild,visit);//遍历左子树

(*visit)(T-data);//访问结点Inorder(T-rchild,visit);//遍历右子

树}}//Inorder算法的递归描述:二叉树算法实现基于二叉链表存储结构38中序

遍历非递归算法算法思想根结点先进栈,左孩子结点紧跟根后面进栈,右孩子结

点在根出栈后入栈;每个结点都要进一次栈和出一次栈,并且总是访问栈顶元素,

因此,算法时间冗杂度为O(n)。

39voidInorder(BiTreeT,void(*visit)(TElemTypee)){//中序遍历二叉树

InitStack(S);p=T;while(p||!StackEmpty(S)){if(p){//往左子树方向前进

Push(S,p);p=p-lchild;}else{//从左子树退回Pop(S,p);(*v

12、isit)(p-data);p=p-rchild;}}//while}//Inorder算法的非递归描述:

二叉树算法实现基于二叉链表存储结构40中序遍历非递归执行过程Ⅰ栈状态动

作说明初始状态AA进栈转向A的左孩子BAB进栈掌握转向B的左孩子,左孩子

为空AB出栈输出B,转向B的右孩子DAD进栈转向D的左孩子EDAE进栈转向E

的左孩子,左孩子为空41中序遍历非递归执行过程Ⅱ栈状态动作说明DAE出栈

输出E,转向E的右孩子,右孩子为空AD出栈输出D,转向D的右孩子FAF进栈

转向F的左孩子,空AF出栈输出F,转向F的右孩子,右孩子为空A出栈输出A,

转向A的右孩子42中序遍历非递归执行过程Ⅲ栈状态动作说明CC进栈转向C的

左孩子,左孩子为空C出栈输出C,转向C的右孩子,右孩子为空栈空

13、,且p=NULL,结束输出:BEDFAC43若二叉树为空树,则空操作;否则,

⑴后序遍历左子树;⑵后序遍历右子树;⑶访问根结点。后(根)序的遍历算法:

访问路径描述:找到最“左边”的叶子结点作为起点,每次经过一个结点时需要

推断:假如是从左子树返回,则进入右子树;假如从右子树返回,则访问该结点

并后退。推断的方法是看该结点的右子树的根是否为刚刚访问的那个结点。后序

遍历序列:

D,G,E,B,F,C,AAFGEDCB44voidPostorder(BiTreeT,void(*visit)(TElemTypee))

{//后序遍历二叉树if(T){Postorder(T-lchild,visit);//遍历左子树

Postorder(T-rchild,visit);//遍历右子

14、树(*visit)(T-data);//访问结点}}//Postorder算法的递归描述:二叉

树算法实现基于二叉链表存储结构45习题1:写出下列图所示的二叉树先序遍历、

中序遍历、后序遍历的序列。⑴先序遍历序列:-,+,a,*,b,-,c,d,/,e,f⑵中

序遍历序列:a,+,b,*,c,-,d,-,e,/,f⑶后序遍历序列:a,b,c,d,-,*,

+,e,f,/,--+/a*b-efcd46ABCDEFGHK习题2:先序序列:中序序列:后序序

列:ABCDEFGHKBDCAEHGKFDCBHKGFEA47习题3:先序序列:中序序列:后序序列:

ABDGCEFHDGBAECHFGDBEHFCAABGDCFHE48

👁️ 阅读量:0