计算机软件技术基础ppt课件.ppt
《计算机软件技术基础ppt课件.ppt》由会员分享,可在线阅读,更多相关《计算机软件技术基础ppt课件.ppt(145页珍藏版)》请在三一办公上搜索。
1、本章中主要介绍下列内容: 树的逻辑定义和存储结构 二叉树的逻辑定义、存储结构 二叉树的基本操作算法 树和二叉树的转换 哈夫曼树及其应用,第六章 树和二叉树,本章学习要求掌握:树和二叉树的性质,有关术语及基本概念。 掌握:二叉树的两种存储方法,重点是链式存储。掌握:各种次序的遍历算法,能灵活运用遍历算法实现二叉树的各种运算。掌握:几种建立二叉树的方法。了解:二叉树的线索化及其实质,了解在各种线索树中查找给定结点的前趋和后继的方法。了解:树、森林与二叉树之间的转换方法。了解:树的各种存储结构及其特点;树和森林的二种次序的遍历。掌握:哈夫曼树的基本概念,最优二叉树和哈夫曼编码方法。,6.1 树基本概
2、念6.2 二叉树的基本操作与存储实现6.3 二叉树的遍历6.4 线索二叉树6.5 二叉树的应用6.6 树的定义与相关术语6.7 树的基本操作与存储6.8 树、森林与二叉树的转换6.9 树和森林的遍历,6.1 树的基本概念,1.树的定义 树是一种常非线性结构树是n(n0)个结点的有限集合。若n=0,则称为空树;否则,有且仅有一个特定的结点被称为根,当n1时,其余结点被分成m(m0)个互不相交的子集T1,T2,.,Tm,每个子集又是一棵树。,递归定义的,树的几种形态,2.树的特点,(1)树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点(2)树中所有结点可以有零个或多个后继结点,树
3、结构和非树结构的示意 图,3. 树的表示方法:,(b ) 凹入表,(a)树形表示,A,B,C,D,E,F,I,J,G,H,(A(B(D)(E(I)(J)(C(G)(H)(d) 嵌套括号表示法,C,D,E,I,J,F,G,H,A,B,(c) 文氏图,4. 基本术语结点(node)表示树中的元素,包括数据项及若干指向其子树的分支结点的度(degree)结点拥有的子树数叶子(leaf)度为0的结点,也叫终端结点分支结点度0的结点,也叫非终端结点结点的层次(level)从根结点算起,根为第一层,它的孩子为第二层树的度一棵树中最大的结点度数树的深度(depth)树中结点的最大层次有序树、无序树 如果树中
4、每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树。森林 是m(m0)棵互不相交的树的集合。,在树结构中,结点之间的关系又可以用家族关系描述,定义如下:孩子(child)结点子树的根称为该结点的孩子双亲(parents)孩子结点的上层结点兄弟(sibling)同一双亲的孩子祖先、子孙如果有一条路径从结点M到结点N,那么M就称为N的祖先,N成为M的子孙堂兄弟 双亲在同一层的结点互为堂兄弟。,叶子:K,L,F,G,M,I,J,结点B,C,D为兄弟结点K,L为兄弟,结点A的度:结点B的度:结点M的度:,结点A的孩子:结点B的孩子:,结点I的双亲:结点L的双亲:,树的度:,结
5、点A的层次:结点M的层次:,树的深度:,结点F,G为堂兄弟结点A是结点F,G的祖先,其它术语:有序树和无序树、森林,3,2,0,D,E,4,1,4,3,B,C,D,E,F,术语,结点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. 树的基本运算常用操作: (1) 构造一个树 CreateTree (T) (2)清空以T为根的树 ClearTree(T) (3)判
6、断树是否为空 TreeEmpty(T) (4)获取给定结点的第i个孩子 Child(T,node,i) (6)获取给定结点的双亲 Parent(T,node) (6)遍历树Traverse(T) 对树遍历的主要目的是将非线性结构通过遍历过程线性化,即获得一个线性序列。树的遍历顺序有两种,一种是先序遍历,即先访问根结点,然后再依次用同样的方法访问每棵子树;另一种是后序遍历,即先依后序遍历方法依次访问每棵子树,最后访问根结点。,6.2 二叉树,6.2.1 二叉树的定义1.定义 二叉树是n(n0)个结点的有限集合。当n=0时,称为空二叉树;当n0时,有且仅有一个结点为二叉树的根,其余结点被分成两个互
7、不相交的子集,一个作为左子集,另一个作为右子集,每个子集又是一个二叉树。 二叉树是另一种树形结构。它与树形结构的区别是: (1)每个结点最多有两棵子树; (2)子树有左右之分。,递归定义的,二叉树结构的图形表示示例,G H,D E F,B C,A,2.二叉树的5种形态:,3. 二叉树的基本运算 (1) 构造一棵二叉树 CreateBTree ( BT) (2)清空以BT为根的二叉树 ClearBTree(BT) (3)判断二叉树是否为空 BTreeEmpty(BT) (4)获取给定结点的左孩子和右孩子 LeftChild(BT,node),RightChild(BT,node) (5)给定结点
8、的左孩子和右孩子 LeftChild(BT,node),RightChild(BT,node) (5)获取给定结点的双亲 Parent(BT,node) (6)遍历二叉树Traverse(BT),6.2.2 二叉树性质,性质1:, 第i层上最大结点数是第i-1层的2倍,即 故命题得证,证明:用归纳法证明之,假设对所有j(1ji)命题成立,即第j层上至多有 个结点,那么,第i-1层至多有 个结点,又二叉树每个结点的度至多为2,性质2:深度为k的二叉树至多有 个结点(k1),证明:由性质1,可得深度为k 的二叉树最大结点数是,性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2
9、,则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+n2 n0=n2+1,几种特殊形式的二叉树,满二叉树定义:,特点:每一层上的结点数都是最大结点数完全二叉树定义:深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为特点叶子结点只可能在层次最大的两层上出现对任一结点,若其右
10、分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l 或l+1,证明:根据完全二叉树的定义和性质2可知,当一棵完全二叉树的深度为k、结点个数为n时,有,2 k-1-1n2k-1,2 k-1 n 2k,K-1 log2n k,性质4:,性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1in),有: (1) 如果i=1,则结点i是二叉树的根,无双亲;如果i1,则其双亲是i/2 (2) 如果2in,则结点i无左孩子;如果2in,则其左孩子是2i (3) 如果2i+1n,则结点i无右孩子;如果2i+1n,则其右孩子是2i+1,2i +2,2i 2i+1 2i+2 2i+
11、3 i+1 2i 2i+1,i,i i+1,6.2.3 二叉树的存储结构 二叉树也可以采用两种存储方式:顺序存储结构和链式存储结构。 1. 顺序存储结构 其存储形式为:用一组连续的存储单元按照完全二叉树的每个结点编号的顺序存放结点内容。,完全二叉树的存储实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素特点:结点间关系蕴含在其存储位置中,1. 顺序存储结构:用一组连续的存储单元按照完全二叉树的 每个结点编号的顺序存放结点内容。,6.2.3 二叉树的存储结构 二叉树也可以采用两种存储方式:顺序存储结构和链式存储结构。,一般二叉树的顺序存储:将一般二叉树添加虚结点转为完全二叉树,然后进行存
12、储,特点:结点间关系蕴含在其存储位置中浪费空间,适于存满二叉树和完全二叉树,在C语言中,这种存储形式的类型定义如下所示:#define MaxTreeNodeNum 100typedef struct datatype dataMaxTreeNodeNum; /* 根存储在下标为1的数组单元中 */ int n; /* 当前完全二叉树的结点个数 */ QBTree;,(1)构造一棵完全二叉树void CreateBTree(QBTree *BT,DataType data ,int n) if (n= MaxTreeNodeNum) n= MaxTreeNodeNum -1; for (i=1
13、; idatai=datai; BT-n=n;,(2)获取给定结点的左孩子 int LeftCHild(QBTree BT , int node) if (2*nodeBT.n) return 0; else return 2*node;RightChild(BT,node)与这个操作类似,读者可试着自行完成。,(3)获取给定结点的双亲 int Parent(QBTree BT , int node) if (1node ,2. 链式存储结构 在顺序存储结构中,利用编号表示元素的位置及元素之间孩子或双亲的关系,因此对于非完全二叉树,需要将空缺的位置用特定的符号填补,若空缺结点较多,势必造成空间
14、利用率的下降。在这种情况下,就应该考虑使用链式存储结构。 常见的二叉树结点结构如下所示: 其中,lchild和rchild是分别指向该结点左孩子和右孩子的指针,data是数据元素的内容。,data,2.链式存储结构二叉链表,typedef struct BiTNode datatype data; struct BiTNode *lchild, *rchild;BiTNode,*BiTree;,在n个结点的二叉链表中,有n+1个空指针域,头指针bt,带头结点的二叉链表,三叉链表:二叉链表寻找孩子结点容易,双亲比较困难。因此,若需要频繁地寻找双亲,可以给每个结点添加一个指向双亲结点的指针域,其结
15、点结构如下所示。,头指针bt,6.2.4 二叉树的基本操作及实现,建立一棵带头结点的空二叉树 Initiate(bt)创建二叉树 Create(x,lbt,rbt)插入左孩子 InsertL(bt,x,parent)插入右孩子 InsertR(bt,x,parent)删除只有一个结点的左子树 DeleteL(bt,parent)删除右子树 DeleteR(bt,parent)查找 Search(bt,x)遍历 Traverse(bt),typedef struct BiTNode datatype data; struct BiTNode *lchild, *rchild;BiTNode,*B
16、iTree;,6.3 遍历二叉树 二叉树是一种非线性的数据结构,在对它进行操作时,总是需要逐一对每个数据元素实施操作,这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作。所谓遍历二叉树就是按某种顺序访问二叉树中的每个结点一次且仅一次的过程。这里的访问可以是输出、比较、更新、查看元素内容等等各种操作。 二叉树的遍历方式分为两大类:一类按根、左子树和右子树三个部分进行访问;另一类按层次访问。下面我们将分别进行讨论。,6.3.1按根、左子树和右子树的遍历,按根、左子树和右子树三部分进行遍历二叉树的顺序存在下面6种可能:,其中,TRL、RTL和RLT三种顺序在左右子树之间均是先右子树后左子树,这与
17、人们先左后右的习惯不同,因此,往往不予采用。余下的三种顺序TLR、LTR和LRT根据根访问的位置不同分别被称为先序遍历、中序遍历和后序遍历。,二叉树的遍历方法先序遍历:若二叉树为空,则结束遍历操作;否则访问根结点;然后分别先序遍历左子树、右子树中序遍历:若二叉树为空,则结束遍历操作;否则先中序遍历左子树,然后访问根结点,最后中序遍历右子树后序遍历:若二叉树为空,则结束遍历操作;先后序遍历左、右子树,然后访问根结点,D L R,先序遍历序列:A B D C,先序遍历:先访问根结点,然后分别先序遍历左子树、右子树,L D R,中序遍历序列:B D A C,中序遍历:先中序遍历左子树,然后访问根结点
18、,最后中序遍历右子树,L R D,后序遍历序列: D B C A,后序遍历:先后序遍历左、右子树,然后访问根结点,先序遍历:,中序遍历:,后序遍历:,-,+,a,*,b,-,c,d,/,e,f,-,+,a,*,b,-,c,d,/,e,f,-,+,a,*,b,-,c,d,/,e,f,下面我们再给出两种遍历二叉树的方法: (1)对一棵二叉树中序遍历时,若我们将二叉树严格地按左子树的所有结点位于根结点的左侧,右子树的所有结点位于根右侧的形式绘制,就可以对每个结点做一条垂线,映射到下面的水平线上,由此得到的顺序就是该二叉树的中序遍历序列。,D G B A E C H F,G H,D E F,B C,A
19、,任何一棵二叉树都可以将它的外部轮廓用一条线绘制出来,我们将它称为二叉树的包线,这条包线对于理解二叉树的遍历过程很有用。,G H,D E F,B C,A,遍历算法:由此可以看出:(1)遍历操作实际上是将非线性结构线性化的过程,其结果为线性序列,并根据采用的遍历顺序分别称为先序序列、中序序列或后序序列;(2)遍历操作是一个递归的过程,因此,这三种遍历操作的算法可以用递归函数实现。递归算法,void PreOrder(BiTree bt) if(bt=NULL)return; printf(%dt,bt-data); PreOrder(bt-lchild); PreOrder(bt-rchild)
20、; ,返回,返回,返回,返回,A,C,B,D,返回,先序序列:A B D C,6.3.2二叉树遍历的非递归算法,(1)先序遍历的非递归实现,可利用堆栈将递归算法改写成非递归的形式BiTree stackMAXNODE;,非递归先序遍历二叉树的主要操作:p=bt;while(1) while(p不空) visit(p-data); /进栈之前访问p结点; push(p,stack); p=p-lchild; if(栈空)return; p=pop(stack); p=p-rchild; ,访问:A,访问:AB,访问:ABC,访问:ABCD,while(p不空) visit(p-data); pu
21、sh(p,stack); p=p-lchild; ,p=pop(stack);p=p-rchild;,访问:ABCDE,访问:ABCDEG,访问:ABCDEGF,栈空结束,=bt;while(1) while(p不空) push(p,stack); p=p-lchild; if(栈空)return; p=pop(stack); visit(p-data); /出栈时访问p结点; p=p-rchild; ,(2)中序遍历的非递归实现,(3)后序遍历的非递归实现,Typedef struct BiTree link; int flag=0; /进栈的次数 stacktype;stacktype s
22、tackMAXNODE;/顺序栈stacktype XP;,结点要入两次栈,出两次栈,在第二次出栈时访问。,=bt;while(1) while(p不空) XP.link=p;XP.flag=1; push(XP,stack); /第一次进栈 p=p-lchild; if(栈空)return; XP=pop(stack);p=XP.link;sign=XP.flag; if(sign=2) /第二次出栈 visit(p-data); p=NULL; else /第一次出栈 XP.link=p;XP.flag=2; push(XP,stack); /第二次进栈 p=p-rchild;,while
23、(p不空) XP.link=p;XP.flag=1; push(XP,stack); /第一次进栈 p=p-lchild; ,XP=pop(stack);p=XP.link;sign=XP.flag; if(sign=2) /第二次出栈 visit(p-data); p=NULL; else /第一次出栈 XP.link=p;XP.flag=2; push(XP,stack); /第二次进栈 p=p-rchild;,C第一次出栈,C第二次进栈,C第二次出栈访问C,B第一次出栈第二次进栈,访问C G,访问C G E,访问C G E F D B,访问C G E F D B A,6.3.3 按层次遍
24、历二叉树 实现方法为从上层到下层,每层中从左侧到右侧依次访问每个结点。下面我们将给出一棵二叉树及其按层次顺序访问其中每个结点的遍历序列。,按层次遍历该二叉树的序列为: ABCDEFGH,二叉树用顺序存储结构表示时,按层遍历的算法实现,(a)完全二叉树,(b)非完全二叉树,图 5-20,void LevelOreder(QBTree BT) for (i=1;i=BT.n;i+) if (BT.datai!=#) Visite(BT.datai);,算法实现,二叉树用链式存储结构表示时,按层遍历的算法实现 访问过程描述如下:访问根结点,并将该结点记录下来;若记录的所有结点都已处理完毕,则结束遍历
25、操作;否则重复下列操作。 取出记录中第一个还没有访问孩子的结点,若它有左孩子,则访问左孩子,并将记录下来;若它有右孩子,则访问右孩子,并记录下来。,在这个算法中,应使用一个队列结构完成这项操作。所谓记录访问结点就是入队操作;而取出记录的结点就是出队操作。这样一来,我们的算法就可以描述成下列形式:(1)访问根结点,并将根结点入队;(2)当队列不空时,重复下列操作:从队列退出一个结点;若其有左孩子,则访问左孩子,并将其左孩子入队;若其有右孩子,则访问右孩子,并将其右孩子入队;,void LevelOrder(BTree *BT) if (!BT) exit; InitQueue(Q); p=BT;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 技术 基础 ppt 课件
链接地址:https://www.31ppt.com/p-1548460.html