数据结构-树和二叉树教案.docx
《数据结构-树和二叉树教案.docx》由会员分享,可在线阅读,更多相关《数据结构-树和二叉树教案.docx(26页珍藏版)》请在课桌文档上搜索。
1、/第六章树和二叉树/下面呢,我们就讨论第六章、树和二叉树。那么我们回忆一下数据结构四大类。第一类,线性结构,除了广义表以外,我们都讨论完了。现在我们开始讨论第二大类,树形结构,在树形结构里面呢,我们主要讨论两种结构。一类树,一类二叉树(线性结构里头我们讨论了什么?)。首先,我们先看树的数据类型定义。那先看数据对象D:具有相同特性的数据元素的集合,这就是它的数据对象。数据元素之间是一个什么样的关系呢,我们用下面这段话来描述。如果数据对象是一个空集,我们称之为空树。从这里看得出来,所有的数据结构都这样一个空的这样一个结构。空串、空表等等。空树的意思是一个数据元素都没有。否那么的话,如果这个集合不是
2、一个空集的话,那么在这个数据结构里面一定存在一个成为根的数据元素root,而且这个数据元素一定是唯的。就是说,一定存在,而且唯一。那么就是说除了空树以外,如果数据集合里面只有一个数据元素的话,那么这个数据元素,就是这个树的根。如果说这个数据集合里面的元素个数大于1的话,其余个结点呢,我们一定可以给它分成m个子集。这些子集互不相交。并且每个子集本身呢,又是一棵符合上面定义的树。这些子集是树,而且称之为根的子树。我们看一个例子,(画图)Abcdefgij这是一个树,当然它不是空树,这个树呢是9个数据元素的集合。一定存在这一个叫做根的结点。这个A呢,我们称之为树根,除了这个根以外,我们可以分成这样三
3、个集合。以B开始的一个子集,以C开始的一个子集,和D开始的一个子集。这三个子集互不相交,每个子集呢又是一棵树,并且它和根呢,有一个关系存在,这棵树叫做根的子树。这棵树呢,又存在一个根结点,这root根和我们子树根之间,存在这一个这样一个前驱后继的关系,一般画树,我们不画箭头,但是我们讨论的是有向树,是有箭头的。就是说BCD是A的后继。那对于B的这样一个子树,又是符合我们定义的子树,那就是说它有一个根结点,它有两颗子树。在根结点和子树根之间呢,又存在一个前驱和后继的关系,那对E、F来说,它们本身又是一颗树。对于E这棵树来说,它的数据元素只有一个,所以它是仅含有根结点的一颗子树。在定义的时候我们说
4、还有空树的,但是在实际使用的时候,是没有意义的。由于我们数据结构和离散数学还是有一定的关系的,在离散数学中,为了一些数学上的完整性的定义,才有空树这样的定义,在我们数据结构中也有定义,单实际上用处不大。这就是树的类型的一个结构特性。下面我们本来就该讨论根本操作了,但是对于树来讲呢,还有一些根本术语介绍一下,以便我们对根本操作的理解。下面就看有关树的根本术语。现在先来看一下有关树的术语。树当中,它的根本单位是一个结点:什么叫结点呢:数据元素+假设干指向子树的分支比方刚刚我们举的那个例子,一个数据元素A+指向BCD的子树的分支,那就称一个结点。结点的度:结点上指向分支的个数(在树上面每个结点的度可
5、能是不一样的,比方我们分解到只含有一个根结点的子树时,它没有子树也没有分支,那它的度就是零。对于刚刚的根结点,它的度就是3.)整个树的度;我们定义为:整个树当中所有结点的度的最大值。对于我们刚刚的那棵树呢,这棵树的度呢,就是3,因为,结点最大的度是3.叶子结点:对树来说,分解到最后,对于子树来说就一个根节点,度为零的结点。(也就是只有一个根结点的子树。对于这样的一个结点,是没有子树的,它对于整个树来说,是很特殊的,叫做叶子结点。除了叶子结点,其他的结点的度都是大与零的。)反过来我们把它叫做分支结点:就是那些度大于零的结点。对于一棵树来说呢,我们经常要谈到的是,根结点,叶子结点、分支结点。当然了
6、,根结点也是分支结点的一种。树呢,我们看是一个层次的结构,那从根结点,沿着分支呢,能走到任何一个结点。从根到这个结点所经过的分支和结点,构成了一条路径。这条路径叫从根到这个结点的路径。在树里面还有一些术语,根我们族谱里面的术语差不多。因为,树这样的个结构,最早就是从族谱中的来的。有孩子结点、双亲结点、前面我们讲到了根和子树根的关系,是父子关系,或者是双亲和孩子的关系。对于树根来说,是树根的孩子,那么反过来,这个跟对子树根来说,它是双亲。兄弟结点呢,是有相同的根的子树,这些子树根之间的关系呢,就是兄弟关系了。它们有相同的双亲。有了兄弟结点,呢我们还可以得到堂兄弟结点。祖先结点的定义呢,我们说从根
7、到结点有条路径,这条路径有假设干个结点,这些结点都是它的祖先。包括它的祖父、太祖父、等这些都是它的祖先。那子孙结点就是,在这棵根以下的结点,都是它的子孙结点。树是一个层次的关系:所以在树上的结点呢,它有它的层次,我们假设根结点的层次为1以下的结点呢,就依次类推了。那也就是说第1层的结点的子树根结点的层次为1+1层。从刚刚这棵树看,A是第一层的,BCD是第二层的。EFG是第三层,的IJ是第四层。叶子结点最大的层次数,我们称之为树的深度。树的深度:树中叶子结点所在的最大层次,就是树的深度。这里面我们要强调一下,数据结构在这个树的层次上来讲呢,有时候约定是不一样的,有的书上把根结点的层数设为0,有的
8、设为L我们在这设定为1.这个时候呢。树的深度是不变的,还是最大层次数,叶子结点的层数变了,变成原来的层数减L(在看别的书的时候,要看一下说明,如果根节点层为0的话,深度和最大的叶子节点层次数差1)那么在数据结构中呢,树和森林是不一样的,但又是两个密切相依赖的两个概念,森林呢,是M棵互不相交树的集合。反过来,从另外一个角度,树的定义可以由森林来定义。就是说任何一棵非空树是一个二元组T=(root,F)都是有一个根和子树森林构成的。(画图)比方(这样的一个树,我去掉了根结点,就可以看作是由3棵树构成的一个森林,这是一二三棵树。这个森林加上一个根,就是一颗树。反过来,森林又是树的集合。这个概念我们以
9、后也会经常用到)下面我们看,树的根本操作。树的根本操作比拟多,我们可以分为三类进行讨论,一类是查找,一类是插入,一类是删除。我们先看查找。查找呢一种是特定的查找种是按关系查找,比方我们查树的根root(T).或者找树上的某个结点返回它的值、或者是给一个值返回树上的这个结点。VaIUe(T,cuje)一种是按关系的查找,有找双亲结点Parent(TCUje)。取这个结点的双亲。反过来,我们按照孩子的关系来找。树呢,有多个孩子,以后,我们会知道,我们是根据第一个孩子,和兄弟关系来找的。一个是每一个结点最左边的孩子,一个是每个结点的右兄弟。那我们看,通过找这个结点的左孩子LeftChild(T,cu
10、r_e),在找这个孩子结点的右兄弟RightSibling(T,cuje),当把有兄弟找完之后,这个结点的孩子结点就完全找到了。还有就是对树的特性进行的操作,一个是看树是不是为空TreeEmPty(T)。一个是树的深度TreeDePth(T),还有一个树的重要操作呢,是树的遍历TraverseTree(T5VisitO)=l).怎么证明呢,我们用归纳法:(画图)。I=I的时候,显然成立,只有一个根结点。2的零次方等于1.我们现在假设i在第k层满足这样的条件就是i=k时,它的结点数呢,满足最多也就是2k“个。那当i=k+l时,由于这一层的结点是上一层结点的子树根。每一个结点最多有两个子树根。那在
11、i=k+l层,结点数最多也就是上一层结点数X2.就是2皿*2=2k=2,性质2:它是说,深度为h的二叉树。它的结点数最多为2工1。深度为h的二叉树呢共有h层,我们让每一层取得结点数最多。看一看h曾最多有多少。从第一层20+2+22+0+2h,=2工1(等比数列的求和公式)。所以深度为k的二叉树上至多还有2J1。这个性质是由性质1得到的。性质3:对于任何一颗二叉树,如果它含有no个叶子节点。n2个度为2的结点。那么它必然存在一个关系式:n=n2+l.(二叉树上的节点只有三种,有多少个度为1的结点,度为0的结点和度为2的结点一定满足这样的关系。(画图,假定二叉树上度为零的结点是no.)度为1的结点
12、的个数是nl.度为2的结点个数为n2。那么总的和肯定是二叉树上总的结点数目n=n+nl+n2,如果二叉树上分支的数目等于b的话,我们分支的数目和节点的数目的关系是什么呢?(画图说明)对于二叉树的结点来说,除了根结点,其他的结点都能找到它的双亲,有一个双亲说明有一个分支,那意味着结点数比分支数多了一个,也就是n=b+l.那么我们看这些分支是谁产生的呢,我们反过来看,度为1的结点产生一个分支,度为2的结点产生两个分支。度为零的结点不产生分支。因此b=2n2+nl那n=2n2+nl+l)。这样我们就得到了两个式子,一个是n=n+nl+n2这是从结点的度的类型这个方面来看。而第二式子那么说明了这些所有
13、节点n和分支数目的关系,而这个分支数目是度为1和度为2的结点产生的。因此,把上面两个式子联立一下,相减:得到n(l-n2=0这就是n=n2+l.那这个式子的意思就是,不管二叉树上有多少个度为1的结点,度为零的结点和度为2的结点存在着这样一个关系。后面两种重要特性呢,涉及到两种特殊的树。一种叫满二叉树:它指的是深度为k且含有2仁1个结点的二叉树。那也就是说什么是满二叉树,那就是说这个二叉树上面不存在度为1的结点。而且除了叶子结点以外,每个结点都有两棵子树。而且只有最后一层是叶子结点。其他都是分支结点。就是每一层都取它最大的结点数。那么就是一个满二叉树。对于满二叉树,我们可以从上到下,从左到右这样
14、进行编号,进行编号以后呢,我们就引出了完全二叉树的概念:树中所含有的n个结点和满二叉树中编号为1至n的结点一一对应。下面我们画一个图来表示。这是一棵满二叉树、我对它进行编号,从1到15.o什么是完全二叉树呢,就是说如果完全二叉树有5个结点。那么这五个结点应该和满二叉树的1到5个结点对应。如果有6个结点、7个结点。那也就是说完全二叉树有这样一个特性,上面每一层都是满二叉树。只有最后一层不满。而且不满也是按照顺序从左到右的依次出现。完全二叉树,在以后的应用中呢,是经常会用到的,所以对于完全二叉树有两个重要的特性。(如一个节点和编号10对应而是和编号11对应了)性质4:具有n个结点的完全二叉树的深度
15、为IOgnJ+Io我们看这个的证明。(画图)假定这个完全二叉树的深度是ko那么它的节点数最大不会超过2k-l,最小呢一定大于深度为k-1的满二叉树,因为你至少的在深度为k的这一层有一个结点。即2kLln=2kJ那也可以这样写:就是2k-,=n2k这样,我们给这个不等式两边取对数。k-l=log2nn,那么该结点无左孩子,否那么,编号为2i的结点为其左孩子结点;(3)假设2i+ln,那么该结点无右孩子结点,否那么,编号为2i+l的结点为其右孩子结点。下面我们就来证明这三个特性,我们先看对于编号为i的结点如果左孩子存在的话,一定是编号为2i,如果右孩子存在的话一定是2i+L我们看对于i=l的时候,
16、我们可以看到如果有左右孩子的话,(画图)一定是2i和2i+l现在我们看一般的情况,对某一层,假设为第k层某一个结点的编号。对于完全二叉树来说,也就是说前面k-1层是满的。这个k-1层结点的个数呢,是2的kl次方减L因此这个节点的编号一定是2的kl次方。下面,我们看它的下一层,这意味着前面k层的个数是满的,一定是2的k次方减1.也就是说这个结点的编号是2的k次方。那么它的兄弟结点呢,一定是2的k次方加1.那么就是说,如果这两个结点存在的话,也就是说2的k次方加1小于n的话,那么这个就成立的。我们用归纳法,对于第i个结点满足这个关系,就是I左孩子是2i,右孩子是2i+l那么我们看它的兄弟,它的兄弟
17、呢,编号一定是i+L它的兄弟的左孩子的编号,显然是这个2i+l结点紧挨着的下一个编号。也就是2i+l的堂兄弟应该是2i+2,它的右孩子呢,应该是2i+32i+2=2(i+l),2i+3=2(i+l)+l所以呢我们这个假设就是成立的,由归纳证明就可以得到。那反过来由这个关系我们很容易得到,如果这个结点的编号是i的话,那它的双亲就是i2o那如果这个结点是i的话,那么他的双亲就是i/2取下整。这个关系呢,是我们以后经常会用到的。关于二叉树的概念呢,我们就讲到这里。下面我们看一下,二叉树的存储结构。二叉树有各种存储表示法,第一种呢,叫二叉树的顺序存储表示。我们用C语言来描述它,就是把二叉树的这个结点呢
18、,存储在一维数组中间。这个一维数组的最大值呢,我们设定为100.二叉树结点的个数呢,由具体的二叉树的结点个数来定。那么如何把这个层次的关系、左右子树的关系用一个一维数组来表示它呢。我们知道一维数组就存储ABCDEF这样的结点。我们知道顺序存储结构仅仅存储的这些ABCDEF结点,而不存储他们之间的关系,他们的关系用固定的的一个位置上的相邻来表示。如果我们把这棵树看成是满二叉树或完全二叉树的一局部。那也就是说把根结点放在一维数组的第一个分量里面,编号为1.的话,那么BD就应该是23。这样的话,我们用含有六个元素的二叉树呢,我们用一个14个分量的一维数组就可以完全表示了。如下列图所示:0123456
19、78910111213ABD(!:1-那么也就是说为了表示这样一个具体的二叉树的结点呢,每个结点不是挨着存储。而是按照它的编号是多少而存在相应的数组分量里面。显然,这种存储方式呢,仅适合与完全二叉树。因为对于完全二叉树来说,前面的元素都是满的。而这个二叉树呢,为了把这个树的左右关系表示出来,我们必须空出很多的空间,所以就很浪费空间了。因此,对于任意的一个二叉树呢,我们不用这样的存储方式。但是对于完全二叉树呢,用这一种方式是相当方便的。这是第一种顺序存储表示。由于二叉树有两个后继,我们经常的用两个指针指向它的后继,下面呢,我们就看看二叉树的链式存储表示。二叉树的链式存储表示,由于结点的不同,可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉 教案
链接地址:https://www.desk33.com/p-1093039.html