计算机软件技术基础课件009.ppt

上传人:b****2 文档编号:2649775 上传时间:2022-11-05 格式:PPT 页数:145 大小:2.71MB
下载 相关 举报
计算机软件技术基础课件009.ppt_第1页
第1页 / 共145页
计算机软件技术基础课件009.ppt_第2页
第2页 / 共145页
计算机软件技术基础课件009.ppt_第3页
第3页 / 共145页
计算机软件技术基础课件009.ppt_第4页
第4页 / 共145页
计算机软件技术基础课件009.ppt_第5页
第5页 / 共145页
点击查看更多>>
下载资源
资源描述

计算机软件技术基础课件009.ppt

《计算机软件技术基础课件009.ppt》由会员分享,可在线阅读,更多相关《计算机软件技术基础课件009.ppt(145页珍藏版)》请在冰豆网上搜索。

计算机软件技术基础课件009.ppt

v本章中主要介绍下列内容:

l树的逻辑定义和存储结构l二叉树的逻辑定义、存储结构l二叉树的基本操作算法l树和二叉树的转换l哈夫曼树及其应用第六章树和二叉树本章学习要求掌握:

树和二叉树的性质,有关术语及基本概念。

掌握:

二叉树的两种存储方法,重点是链式存储。

掌握:

各种次序的遍历算法,能灵活运用遍历算法实现二叉树的各种运算。

掌握:

几种建立二叉树的方法。

了解:

二叉树的线索化及其实质,了解在各种线索树中查找给定结点的前趋和后继的方法。

了解:

树、森林与二叉树之间的转换方法。

了解:

树的各种存储结构及其特点;树和森林的二种次序的遍历。

掌握:

哈夫曼树的基本概念,最优二叉树和哈夫曼编码方法。

6.1树基本概念6.2二叉树的基本操作与存储实现6.3二叉树的遍历6.4线索二叉树6.5二叉树的应用6.6树的定义与相关术语6.7树的基本操作与存储6.8树、森林与二叉树的转换6.9树和森林的遍历6.16.1树的基本概念树的基本概念1.1.树的定义树的定义树树是一种常非线性结构树是n(n0)个结点的有限集合。

若n=0,则称为空树;否则,有且仅有一个特定的结点被称为根,当n1时,其余结点被分成m(m0)个互不相交的子集T1,T2,.,Tm,每个子集又是一棵树。

递归定义的递归定义的树的几种形态2.2.树的特点树的特点

(1)树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点

(2)树中所有结点可以有零个或多个后继结点树结构和非树结构的示意图3.3.树的表示方法:

树的表示方法:

(b)凹入表(a)树形表示ABCDEFIJGH(A(B(D)(E(I)(J)(C(G)(H)(d)嵌套括号表示法CDEIJFGHAB(c)文氏图4.4.基本术语基本术语v结点(node)表示树中的元素,包括数据项及若干指向其子树的分支v结点的度(degree)结点拥有的子树数v叶子(leaf)度为0的结点,也叫终端结点v分支结点度0的结点,也叫非终端结点v结点的层次(level)从根结点算起,根为第一层,它的孩子为第二层v树的度一棵树中最大的结点度数v树的深度(depth)树中结点的最大层次v有序树、无序树如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树。

v森林是m(m0)棵互不相交的树的集合。

在树结构中,结点之间的关系又可以用家族关系描述,定义如下:

v孩子(child)结点子树的根称为该结点的孩子v双亲(parents)孩子结点的上层结点v兄弟(sibling)同一双亲的孩子v祖先、子孙如果有一条路径从结点M到结点N,那么M就称为N的祖先,N成为M的子孙v堂兄弟双亲在同一层的结点互为堂兄弟。

ABCDEFGHIJKLM叶子:

K,L,F,G,M,I,J结点B,C,D为兄弟结点K,L为兄弟结点A的度:

结点B的度:

结点M的度:

结点A的孩子:

结点B的孩子:

结点I的双亲:

结点L的双亲:

树的度:

结点A的层次:

结点M的层次:

树的深度:

结点F,G为堂兄弟结点A是结点F,G的祖先其它术语:

有序树和无序树、森林320DE4143B,C,DE,F术语ABDEFHJKLM结点A的度:

2结点B的度:

2结点M的度:

0叶子:

K,L,F,M,J结点A的孩子:

B,D结点B的孩子:

E,F结点J的双亲:

D结点L的双亲:

E结点B,D为兄弟结点K,L为兄弟树的度:

2结点A的层次:

1结点M的层次:

4树的深度:

4结点F,H为堂兄弟结点A是结点F,H的祖先5.5.树的基本运算树的基本运算常用操作常用操作:

(1)构造一个树CreateTree(T)

(2)清空以T为根的树ClearTree(T)(3)判断树是否为空TreeEmpty(T)(4)获取给定结点的第i个孩子Child(T,node,i)(6)获取给定结点的双亲Parent(T,node)(6)遍历树Traverse(T)对树遍历的主要目的是将非线性结构通过遍历过程线性化,即获得一个线性序列。

树的遍历顺序有两种,一种是先序遍历,即先访问根结点,然后再依次用同样的方法访问每棵子树;另一种是后序遍历,即先依后序遍历方法依次访问每棵子树,最后访问根结点。

6.26.2二叉树二叉树6.2.16.2.1二叉树的定义二叉树的定义1.1.定义定义二叉树二叉树是n(n0)个结点的有限集合。

当n=0时,称为空二叉树;当n0时,有且仅有一个结点为二叉树的根,其余结点被分成两个互不相交的子集,一个作为左子集,另一个作为右子集,每个子集又是一个二叉树。

二叉树二叉树是另一种树形结构。

它与树形结构的区别是:

(1)每个结点最多有两棵子树;

(2)子树有左右之分。

递归定义的递归定义的二叉树结构的图形表示示例GHDEFBCA只有根结点的二叉树空二叉树左子树右子树为空右子树左子树为空左子树右子树左、右子树均非空2.2.二叉树的二叉树的55种形态种形态:

3.3.二叉树的基本运算二叉树的基本运算

(1)构造一棵二叉树CreateBTree(BT)

(2)清空以BT为根的二叉树ClearBTree(BT)(3)判断二叉树是否为空BTreeEmpty(BT)(4)获取给定结点的左孩子和右孩子LeftChild(BT,node),RightChild(BT,node)(5)给定结点的左孩子和右孩子LeftChild(BT,node),RightChild(BT,node)(5)获取给定结点的双亲Parent(BT,node)(6)遍历二叉树Traverse(BT)6.2.2二叉树性质v性质1:

第i层上最大结点数是第i-1层的2倍,即故命题得证证明:

用归纳法证明之i=1时,只有一个根结点是对的假设对所有j(1ji)命题成立,即第j层上至多有个结点那么,第i-1层至多有个结点又二叉树每个结点的度至多为2v性质2:

深度为k的二叉树至多有个结点(k1)证明:

由性质1,可得深度为k的二叉树最大结点数是v性质3:

对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1证明:

n1为二叉树T中度为1的结点数因为:

二叉树中所有结点的度均小于或等于2所以:

其结点总数n=n0+n1+n2又二叉树中,除根结点外,其余结点都只有一个分支进入设B为分支总数,则n=B+1又:

分支由度为1和度为2的结点射出,B=n1+2n2于是,n=B+1=n1+2n2+1=n0+n1+n2n0=n2+1几种特殊形式的二叉树v满二叉树l定义:

l特点:

每一层上的结点数都是最大结点数v完全二叉树l定义:

深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为l特点u叶子结点只可能在层次最大的两层上出现u对任一结点,若其右分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l或l+1ABCKDEHILFGJ123456789101112ABCKDEHILMFGJNO1234567891011131415ABCDEJK1234567ABCDEG123456证明:

根据完全二叉树的定义和性质2可知,当一棵完全二叉树的深度为k、结点个数为n时,有2k-1-1n2k-12k-1n2kK-1log2n1,则其双亲是i/2

(2)如果2in,则结点i无左孩子;如果2in,则其左孩子是2i(3)如果2i+1n,则结点i无右孩子;如果2i+1n,则其右孩子是2i+12i+22i2i+12i+22i+3i+12i2i+1iii+16.2.3二叉树的存储结构二叉树也可以采用两种存储方式:

顺序存储结构和链式存储结构。

1.顺序存储结构其存储形式为:

用一组连续的存储单元按照完全二叉树的每个结点编号的顺序存放结点内容。

l完全二叉树的存储实现:

按满二叉树的结点层次编号,依次存放二叉树中的数据元素l特点:

结点间关系蕴含在其存储位置中ABCKDEHILFGJ1234567891011121.顺序存储结构:

用一组连续的存储单元按照完全二叉树的每个结点编号的顺序存放结点内容。

ABCDEFGHIJKL1234567891011126.2.3二叉树的存储结构二叉树也可以采用两种存储方式:

顺序存储结构和链式存储结构。

l一般二叉树的顺序存储:

将一般二叉树添加虚结点转为完全二叉树,然后进行存储ABCDEJK1234567891011l特点:

u结点间关系蕴含在其存储位置中u浪费空间,适于存满二叉树和完全二叉树ABCDEJK1234567891011在C语言中,这种存储形式的类型定义如下所示:

#defineMaxTreeNodeNum100typedefstructdatatypedataMaxTreeNodeNum;/*根存储在下标为1的数组单元中*/intn;/*当前完全二叉树的结点个数*/QBTree;

(1)构造一棵完全二叉树voidCreateBTree(QBTree*BT,DataTypedata,intn)if(n=MaxTreeNodeNum)n=MaxTreeNodeNum-1;for(i=1;idatai=datai;BT-n=n;

(2)获取给定结点的左孩子intLeftCHild(QBTreeBT,intnode)if(2*nodeBT.n)return0;elsereturn2*node;RightChild(BT,node)与这个操作类似,读者可试着自行完成。

(3)获取给定结点的双亲intParent(QBTreeBT,intnode)if(1node&nodeBDCDLR先序遍历序列:

ABDC先序遍历:

先访问根结点,然后分别先序遍历左子树、右子树ADBCLDRBLDRLDRADCLDR中序遍历序列:

BDAC中序遍历:

先中序遍历左子树,然后访问根结点,最后中序遍历右子树ADBCLRDLRDLRDADCLRD后序遍历序列:

DBCA后序遍历:

先后序遍历左、右子树,然后访问根结点B-+/a*b-efcd先序遍历:

中序遍历:

后序遍历:

-+a*b-cd/ef-+a*b-cd/ef-+a*b-cd/ef下面我们再给出两种遍历二叉树的方法:

(1)对一棵二叉树中序遍历时,若我们将二叉树严格地按左子树的所有结点位于根结点的左侧,右子树的所有结点位于根右侧的形式绘制,就可以对每个结点做一条垂线,映射到下面的水平线上,由此得到的顺序就是该二叉树的中序遍历序列。

DGBAECHFGHDEFBCA任何一棵二叉树都可以将它的外部轮廓用一条线绘制出来,我们将它称为二叉树的包线,这条包线对于理解二叉树的遍历过程很有用。

GHDEFBCAv遍历算法:

由此可以看出:

(1)遍历操作实际上是将非线性结构线性化的过程,其结果为线性序列,并根据采用的遍历顺序分别称为先序序列、中序序列或后序序列;

(2)遍历操作是一个递归的过程,因此,这三种遍历操作的算法可以用递归函数实现。

l递归算法voidPreOrder(BiTreebt)if(bt=NULL)return;printf(%dt,bt-data);PreOrder(bt-lchild);PreOrder(bt-rchild);主程序主程序Pre(T)返回返回pre(TR);返回返回pre(TR);ACBDTBprintf(B);pre(TL);BTAprintf(A);pre(TL);ATDprintf(D);pre(TL);DTCprintf(C);pre(TL);C返回T左是空返回pre(TR);T左是空返回T右是空返回T左是空返回T右是空返回pre(TR);先序序列:

ABDC6.3.2二叉树遍历的非递归算法

(1)先序遍历的非递归实现可利用堆栈将递归算法改写成非递归的形式BiTreestackMAXNODE;X遍历左子树遍历右子树访问结点bt非递归先序

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1