数据结构要点.docx

上传人:b****4 文档编号:11588801 上传时间:2023-03-19 格式:DOCX 页数:25 大小:44.22KB
下载 相关 举报
数据结构要点.docx_第1页
第1页 / 共25页
数据结构要点.docx_第2页
第2页 / 共25页
数据结构要点.docx_第3页
第3页 / 共25页
数据结构要点.docx_第4页
第4页 / 共25页
数据结构要点.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

数据结构要点.docx

《数据结构要点.docx》由会员分享,可在线阅读,更多相关《数据结构要点.docx(25页珍藏版)》请在冰豆网上搜索。

数据结构要点.docx

数据结构要点

第一章概论

本章的重点是了解数据结构的逻辑结构、存储结构、数据的运算三方面的概念及相互关系,难点是算法复杂度的分析方法。

需要达到<识记>层次的基本概念和术语有:

数据、数据元素、数据项、数据结构。

特别是数据结构的逻辑结构、存储结构及数据运算的含义及其相互关系。

数据结构的两大类逻辑结构和四种常用的存储表示方法。

需要达到<领会>层次的内容有算法、算法的时间复杂度和空间复杂度、最坏的和平均时间复杂度等概念,算法描述和算法分析的方法、对一般的算法要能分析出时间复杂度。

对于基本概念,仔细看书就能够理解,这里简单提一下:

数据就是指能够被计算机识别、存储和加工处理的信息的载体。

数据元素是数据的基本单位,有时一个数据元素可以由若干个数据项组成。

数据项是具有独立含义的最小标识单位。

如整数这个集合中,10这个数就可称是一个数据元素.又比如在一个数据库(关系式数据库)中,一个记录可称为一个数据元素,而这个元素中的某一字段就是一个数据项。

数据结构的定义虽然没有标准,但是它包括以下三方面内容:

逻辑结构、存储结构、和对数据的操作。

这一段比较重要,我用自己的语言来说明一下,大家看看是不是这样。

比如一个表(数据库),我们就称它为一个数据结构,它由很多记录(数据元素)组成,每个元素又包括很多字段(数据项)组成。

那么这张表的逻辑结构是怎么样的呢?

我们分析数据结构都是从结点(其实也就是元素、记录、顶点,虽然在各种情况下所用名字不同,但说的是同一个东东)之间的关系来分析的,对于这个表中的任一个记录(结点),它只有一个直接前趋,只有一个直接后继(前趋后继就是前相邻后相邻的意思),整个表只有一个开始结点和一个终端结点,那我们知道了这些关系就能明白这个表的逻辑结构了。

而存储结构则是指用计算机语言如何表示结点之间的这种关系。

如上面的表,在计算机语言中描述为连续存放在一片内存单元中,还是随机的存放在内存中再用指针把它们链接在一起,这两种表示法就成为两种不同的存储结构。

(注意,在本课程里,我们只在高级语言的层次上讨论存储结构。

第三个概念就是对数据的运算,比如一张表格,我们需要进行查找,增加,修改,删除记录等工作,而怎么样才能进行这样的操作呢?

这也就是数据的运算,它不仅仅是加减乘除这些算术运算了,在数据结构中,这些运算常常涉及算法问题。

弄清了以上三个问题,就可以弄清数据结构这个概念。

通常我们就将数据的逻辑结构简称为数据结构,数据的逻辑结构分两大类:

线性结构和非线性结构(这两个很容易理解)

数据的存储方法有四种:

顺序存储方法、链接存储方法、索引存储方法和散列存储方法。

下一个是难点问题,就是算法的描述和分析,主要是算法复杂度的分析方法及其运用。

首先了解一下几个概念。

一个是时间复杂度,一个是渐近时间复杂度。

前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。

当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n)简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。

此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。

但是我们总是考虑在最坏的情况下的时间复杂度。

以保证算法的运行时间不会比它更长。

常见的时间复杂度,按数量级递增排列依次为:

常数阶O

(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。

时间复杂度的分析计算请看书本上的例子,然后我们通过做练习加以领会和巩固。

第二章

线性表

本章的重点是掌握顺序表和单链表上实现的各种基本算法及相关的时间性能分析,难点是使用本章所学的基本知识设计有效算法解决与线性表相关的应用问题。

要求达到<识记>层次的内容有:

线性表的逻辑结构特征;线性表上定义的基本运算,并利用基本运算构造出较复杂的运算。

要求达到<综合应用>层次的内容有:

顺序表的含义及特点,顺序表上的插入、删除操作及其平均时间性能分析,解决简单应用问题。

链表如何表示线性表中元素之间的逻辑关系;单链表、双链表、循环链表链接方式上的区别;单链表上实现的建表、查找、插入和删除等基本算法及其时间复杂度。

循环链表上尾指针取代头指针的作用,以及单循环链表上的算法与单链表上相应算法的异同点。

双链表的定义和相关算法。

利用链表设计算法解决简单应用问题。

要求达到<领会>层次的内容就是顺序表和链表的比较,以及如何选择其一作为其存储结构才能取得较优的时空性能。

线性表的逻辑结构特征是很容易理解的,如其名,它的逻辑结构特征就好象是一条线,上面打了一个个结,很形象的,如果这条线上面有结,那么它就是非空表,只能有一个开始结点,有且只能有一个终端结点,其它的结前后所相邻的也只能是一个结点(直接前趋和直接后继)。

关于线性表上定义的基本运算,主要有构造空表、求表长、取结点、查找、插入、删除等。

线性表的逻辑结构和存储结构之间的关系。

在计算机中,如何把线性表的结点存放到存储单元中,就有许多方法,最简单的方法就是按顺序存储。

就是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中。

在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一致的。

在顺序表中实现的基本运算主要讨论了插入和删除两种运算。

相关的算法我们通过练习掌握。

对于顺序表的插入和删除运算,其平均时间复杂度均为O(n)。

线性表的链式存储结构。

它与顺序表不同,链表是用一组任意的存储单元来存放线性表的结点,这组存储单元可以分布在内存中任何位置上。

因此,链表中结点的逻辑次序和物理次序不一定相同。

所以为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还存储了其后继结点的地址信息(即指针或链)。

这两部分信息组成链表中的结点结构。

一个单链表由头指针的名字来命名。

对于单链表,其操作运算主要有建立单链表(头插法、尾插法和在链表开始结点前附加一个头结点的算法)、查找(按序号和按值)、插入运算、删除运算等。

以上各运算的平均时间复杂度均为O(n).其主要时间是耗费在查找操作上。

循环链表是一种首尾相接的链表。

也就是终端结点的指针域不是指向NULL空而是指向开始结点(也可设置一个头结点),形成一个环。

采用循环链表在实用中多采用尾指针表示单循环链表。

这样做的好处是查找头指针和尾指针的时间都是O

(1),不用遍历整个链表了。

判别链表终止的条件也不同于单链表,它是以指针是否等于某一指定指针如头指针或尾指针来确定。

双链表就是双向链表,就是在单链表的每个结点里再增加一个指向其直接前趋的指针域prior,这样形成的链表就有两条不同方向的链。

使得从已知结点查找其直接前趋结点可以和查找其直接后继结点的时间一样缩短为O

(1)。

双链表一般也由头指针head惟一确定。

双链表也可以头尾相链接构成双(向)循环链表。

关于顺序表和链表的比较,请看下表:

具体要求

顺序表

链表

基于空间

适于线性表长度变化不大,易于事先确定其大小时采用。

适于当线性表长度变化大,难以估计其存储规模时采用。

基于时间

由于顺序表是一种随机存储结构,当线性表的操作主要是查找时,宜采用。

链表中对任何位置进行插入和删除都只需修改指针,所以这类操作为主的线性表宜采用链表做存储结构。

若插入和删除主要发生在表的首尾两端,则宜采用尾指针表示的单循环链表。

 

第三章栈和队列

本章介绍的是栈和队列的逻辑结构定义及在两种存储结构(顺序存储结构和链式存储结构)上如何实现栈和队列的基本运算。

本章的重点是掌握栈和队列在两种存储结构上实现的基本运算,难点是循环队列中对边界条件的处理。

1.栈的逻辑结构、存储结构及其相关算法(综合应用):

栈的逻辑结构和我们先前学过的线性表相同,如果它是非空的,则有且只有一个开始结点,有且只能有一个终端结点,其它的结点前后所相邻的也只能是一个结点(直接前趋和直接后继),但是栈的运算规则与线性表相比有更多的限制,栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,通常称插入、删除这一端为栈顶,另一端称为栈底。

表中无元素时为空栈。

栈的修改是按后进先出的原则进行的,我们又称栈为LIFO表(LastInFirstOut).

栈的基本运算有六种:

构造空栈:

InitStack(S)、

判栈空:

StackEmpty(S)、

判栈满:

StackFull(S)、

进栈:

Push(S,x)、可形象地理解为压入,这时栈中会多一个元素

退栈:

Pop(S)、可形象地理解为弹出,弹出后栈中就无此元素了。

取栈顶元素:

StackTop(S),不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。

由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。

我们要了解的是,在顺序栈中有"上溢"和"下溢"的概念。

顺序栈好比一个盒子,我们在里头放了一叠书,当我们要用书的话只能从第一本开始拿(你会把盒子翻过来吗?

真聪明^^),那么当我们把书本放到这个栈中超过盒子的顶部时就放不下了(叠上去的不算,哼哼),这时就是"上溢","上溢"也就是栈顶指针指出栈的外面,显然是出错了。

反之,当栈中已没有书时,我们再去拿,看看没书,把盒子拎起来看看盒底,还是没有,这就是"下溢"。

"下溢"本身可以表示栈为空栈,因此可以用它来作为控制转移的条件。

链栈则没有上溢的限制,它就象是一条一头固定的链子,可以在活动的一头自由地增加链环(结点)而不会溢出,链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要在头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。

以上两种存储结构的栈的基本操作算法是不同的,我们主要要学会进栈和退栈的基本算法以解决简单的应用问题。

2.队列的逻辑结构、存储结构及其相关算法(综合应用)。

队列(Queue,念Q音)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头(Front)

队列的操作原则是先进先出的,所以队列又称作FIFO表(FirstInFirstOut)

队列的基本运算也有六种:

置空队:

InitQueue(Q)

判队空:

QueueEmpty(Q)

判队满:

QueueFull(Q)

入队:

EnQueue(Q,x)

出队:

DeQueue(Q)

取队头元素:

QueueFront(Q),不同与出队,队头元素仍然保留

队列也有顺序存储和链式存储两种存储结构,前者称顺序队列,后者为链队。

对于顺序队列,我们要理解"假上溢"的现象。

我们现实中的队列比如人群排队买票,队伍中的人是可以一边进去从另一头出来的,除非地方不够,总不会有"溢出"的现象,相似地,当队列中元素完全充满这个向量空间时,再入队自然就会上溢,如果队列中已没有元素,那么再要出队也会下溢。

那么"假上溢"就是怎么回事呢?

因为在这里,我们的队列是存储在一个向量空间里,在这一段连续的存储空间中,由一个队列头指针和一个尾指针表示这个队列,当头指针和尾指针指向同一个位置时,队列为空,也就是说,队列是由两个指针中间的元素构成的。

在队列中,入队和出队并不是象现实中,元素一个个地向前移动,走完了就没有了,而是指针在移动,当出队操作时,头指针向前(即向量空间的尾部)增加一个位置,入队时,尾指针向前增加一个位置,在某种情况下,比如说进一个出一个,两个指针就不停地向前移动,直到队列所在向量空间的尾部,这时再入队的话,尾指针就要跑到向量空间外面去了,仅管这时整个向量空间是空的,队列也是空的,却产生了"上溢"现象,这就是假上溢。

为了克服这种现象造成的空间浪费,我们引入循环向量的概念,就好比是把向量空间弯起来,形成一个头尾相接的环形,这样,当存于其中的队列头尾指针移到向量空间的上界(尾部)时,再加1的操作(入队或出队)就使指针指向向量的下界,也就是从头开始。

这时的队列就称循环队列。

通常我们应用的大都是循环队列。

由于循环的原因,光看头尾指针重叠在一起我们并不能判断队列是空的还是满的,这时就需要处理一些边界条件,以区别队列是空还是满。

方法至少有三种,一种是另设一个布尔变量来判断(就是请别人看着,是空还是满由他说了算),第二种是少用一个元素空间,当入队时,先测试入队后尾指针是不是会等于头指针,如果相等就算队已满,不许入队。

第三种就是用一个计数器记录队列中的元素的总数,这样就可以随时知道队列的长度了,只要队列中的元素个数等于向量空间的长度,就是队满。

以上是顺序队列,我们要掌握相应算法以解决简单应用问题。

队列的链式存储结构称为链队列,一个链队列就是一个操作受限的单链表。

为了便于在表尾进行插入(入队)的操作,在表尾增加一个尾指针,一个链队列就由一个头指针和一个尾指针唯一地确定。

链队列不存在队满和上溢的问题。

在链队列的出队算法中,要注意当原队中只有一个结点时,出队后要同进修改头尾指针并使队列变空。

3.栈和队列的应用(领会)

教材中举了几个例子,对于我们初学者来说,看上去比较繁,我们只要掌握一点,那就是,对于什么情况下用栈和队列作为解决问题的数据结构。

判断的要点就是:

如果这个问题满足后进先出(LIFO)的原则,就可以使用栈来处理。

如果这个问题满足先进先出(FIFO)的原则,就可以使用队列来处理。

比如简单的说,有一个数组序列,我们输入时按顺序输入,但是输出时需要逆序输出,那么它就可以利用栈来处理,把这个数组存入一个栈中就可以容易地按逆序输出结果了。

第四章

本章介绍了串的逻辑结构,存储结构及串上的基本运算,由于在高级语言中已经提供了较全善的串处理功能,因此本章的重点是掌握在串上实现的模式匹配算法。

同时这也是本章的难点。

但是从全书来讲,这属于较简单的一章内容。

1.串及其运算(领会)(这些内容比较容易理解,不用死记)

串就是字符串,是一种特殊的线性表,它的每个结点仅由一个字符组成。

空串:

是指长度为零的串,也就是串中不包含任何字符(结点)。

空白串:

指串中包含一个或多个空格字符的串。

不同与空串,它的结点就是一个空格字符。

在一个串中任意个连续字符组成的子序列称为该串的子串,包含子串的串就称为主串。

子串在主串中的序号就是指子串在主串中首次出现的位置。

如A="Iloveyou"

B="love",则B在A中的序号为3,注意空格也是字符。

空串是任意串的子串,任意串是他自身的子串。

串分为两种:

串常量和串变量。

串常量在程序中不能改变,串变量则可以。

关于串的基本运算,基本上在C语言中已经学过,主要有

求串长strlen(char*s)、

串复制strcpy(char*to,char*from)、

串联接strcat(char*to,char*from)、

串比较charcmp(char*s1,char*s2)

和字符定位strchr(char*s,charc)等

这些基本运算通过练习来掌握。

2.串的存储结构(简单应用)

串是特殊的线性表(结点是字符),所以串的存储结构与线性表的存储结构类似。

串的顺序存储结构简称为顺序串,顺序串又可按存储分配的不同分为静态存储分配的顺序串和动态存储分配的顺序串。

静态的意思可简单地理解为一个确定的存储空间,它的长度是不可变的。

如直接使用定长的字符数组来定义一个串。

它的优点是涉及串长的操作速度快,因为它的最大长度是不变的。

动态存储分配就是在定义串时不分配存储空间,直到需要使用时按所需串的长度分配存储单元给它,并且在运行中还可以根据需要变化串的长度,这就是动态分配。

不过这样的串仍是顺序存储的,也就是说指针指向串的首地址,后面的结点是连续存储的。

串的链式存储就是用单链表的方式存储串值,串的这种链式存储结构简称为链串。

链串与单链表的差异只是它的结点数据域为单个字符。

这种存储结构方便于串的插入和删除操作,但是空间利用率不高,因为存放每一个字符要"搭配"一个指向下一字符的地址,而地址所占空间是比较大的。

为了解决这种"存储密度"过低的状况,可以让一个结点存储多个字符,事实上这是顺序串和链串的综合(折衷)。

本章的重点和难点就是串运算的实现,特别是顺序串上子串定位的运算。

子串定位运算又称串的"模式匹配"或"串匹配",就是在主串中查找出子串出现的位置,这在应用中非常广泛,比如文本编辑中的"查找和替换"用到的就是子串定位运算的算法。

在串匹配中,将主串称为目标(串),子串称为模式(串),我们这样想象,子串就如同一个模板(样本),用它在目标上对比,从头往后比较,凡是遇到一模一样的那么一段,就算找到一个位置了(我们就说,从这个位置开始的匹配成功)。

用很专业的很酷的话说就是"模式在目标中出现"(我想起了警匪片里的对话),如果这个模板对应的目标串中有不一样的字符出现,那么这个位置就匹配失败。

当我们用这个模子依次从目标的头部往后移,移动到的位置就叫位移,如果每次向右移动1格,那么每次的位移就加上1。

每次移动后要看看模板里的字符和目标中相应的字符是否相等,如果都相同,这次位移就叫有效位移(其实就是从这个位置开始的匹配成功)

另外有一个合法位移和不合法位移的概念,就是说,移动一个位置后,如果模板的最后一个字符还没有超出目标串中最后一个字符时,这个位移就是合法位移,如果超出了,那么就没有比较的意义了,这时就是不合法位移。

这是比较容易理解的,串匹配问题就是找出给定模式串P在给定目标串T中首次出现的有效位移或者是全部有效位移。

具体的串匹配算法也不是很难理解,就是用两个循环,外循环用于进行模式的位移,内循环进行模板内每个字符的比较(判断是否有效位移)。

关于串匹配的时间复杂度,在最坏的情况下就是目标串和模式串分别是"a^n-1b"和"a^m-1b"的形式,就是说,每一次合法位移后,在内循环中都要比较m个字符才知道是不是有效位移(前面的字符都是一样的)。

所以最坏的情况下时间复杂度是O((n-m+1)m),假如m与n同阶的话则它是O(n^2)。

链串上的子串定位运算的不同之处就是位移是结点地址而不是整数。

理解一下算法即可。

真正的应用主要还是要掌握串的基本算法并用它们构造出可以解决具体问题的简单算法。

第五章

多维数组和广义表

前面我们学习的线性表、栈、队列和串都是线性结构,本章起学习的是非线性结构。

它们的逻辑特征是:

一个数据元素可能有多个直接前趋和多个直接后继。

本章重点是熟悉多维数组的存储方式、矩阵的压缩存储方式、广义表的定义及其求表头和表尾的运算,难点是稀疏矩阵的压缩存储表示下实现的算法。

多维数组:

(领会)

多维数组的逻辑结构特征:

一个m维数组An1n2...nm的每个元素都属于m个向量,最多可以有m个直接前趋和m个直接后继。

多维数组的顺序存储结构及其地址计算方式:

计算机的内存结构是一维的,因此将数组元素排成线性序列,然后将这个线性序列存放在存储器中。

排列的方式有两种,一是行优先顺序,也就是把数组按一行一行的顺序依次排列。

二是列优先顺序,就是把数组按一列列的顺序依次排列。

地址的计算方法:

我们按行优先顺序排列的数组,是这样计算的,假设每个元素占用d个存储单元,某个元素的地址就是它前面所有行所占的单元加上它所在行前面所有列元素所占的单元数之和。

不必去死记公式。

数组是一种随机存储结构的原因:

因为在顺序存储的情况下,每一个元素都有与其下标相对应的地址,因此可以对数组中的元素进行随机存储。

矩阵的压缩存储:

(领会)

特殊矩阵的概念:

所谓特殊矩阵是指非零元素或零元素分布有一定规律的矩阵。

稀疏矩阵的概念:

一个矩阵中若其非零元素的个数远远小于零元素的个数,则该矩阵称为稀疏矩阵。

我们在本章学习了对称矩阵、三角矩阵、对角矩阵这三种特殊矩阵。

这三种特殊矩阵可以进行压缩存储。

主要要理解的是其下标变换方法。

稀疏矩阵的压缩存储方式三元组表就是把非零元素的值和它所在的行号列号做为一个结点存放在一起,用这些结点组成的一个线性表(三元组表)来表示这个稀疏矩阵。

但是这种压缩存储方式将失去随机存储功能。

相关算法的理解要建立在对三元组表的结构的全面掌握的基础上。

但是本章的算法考试应不作要求。

广义表的概念(领会):

广义表又称列表(Lists),是线性表的推广。

就是说,广义表中的元素不仅可以是数或一个结构,而且推广到可以是一个表(这个表又可以是广义表)。

所以,广义表是n(n≥0)个元素a1,a2,a3...an的有限序列,其中的ai或者是原子或者是一个广义表。

(为什么叫原子?

因为原子是作为结构上不可分割的成分。

广义表表头和表尾的概念:

若广义表LS非空(n≥1),则这个广义表的第一个元素就是表头。

(这个表头可以是原子,也可以是该广义表的子表。

)而其余的元素组成的表称为LS的表尾(要注意,不是最后一个元素,这和队列的队尾是不同的),所以表尾必是一个子表。

广义表有两种表示法,一种是括号表示法,一种是图形表示法。

括号表示时,一般以大写字母表示广义表,以小写字母表示原子。

如:

A(x,L(a,b))。

用图形表示时,图形中的分支结点对应广义表,非分支结点一般表示原子,如果一个广义表与树(形结构)相对应,这个广义表就是纯表。

如果一个广义表的结点又可以被其他结点所共享,则这个表称为再入表。

允许递归的表称为递归表。

有一个关系式:

递归表(包含)再入表(包含)纯表(树)(包含)线性表。

可见,广义表是对线性表和树的推广。

广义表有两个特殊的基本运算,取表头head(LS)和取表尾tail(LS).(我们看到tail这个词就是尾巴,是一条尾巴,而不是末尾,它可能是一个原子,但这个原子是作为子表来看待的)

取表头和表尾的运算要在广义表非空的情况下进行。

注意广义表()表示是空表,(())则表示有一个元素的广义表,这个元素是一个空表。

这两个运算很容易理解也应该掌握。

第六章

本章是重点章,二叉树又是本章的重点内容,我们要了解树的定义熟悉二叉树的定义、性质、存储结构、遍历、线索化和树的存储结构、遍历以及树、森林与二叉树的转换,哈夫曼树及哈夫曼编码等内容。

算法的重点是二叉树的遍历及其有关应用。

这也是本章的难点。

一、树的概念:

(领会)

关于树的概念,主要是应能理解有关树的一些名词术语的含义,现列举如下,请大家对照回忆一下:

(把光标移到该名词上可看到其解释)

空树

根(开始结点)

子数

子树

子树

叶子(终端结点)

分支结点(非终端结点)

 

 

内部结点

祖先

双亲

孩子

兄弟

子孙

路径(Path)

层数

堂兄弟

高度(深度)

 

有序树

无序树

森林

树的逻辑结构特征是:

树中任一结点都可以有零个或多个直接后继(孩子)结点,但至多只能有一个直接前趋(双亲)结点。

树形结构是非线性结构。

树的四种不同表示方法:

一是树形表示法(注意树枝无方向箭头)。

二是嵌套集合表示法。

(书中图6.2b中的D似应写在其下的圆内更妥当一些)。

三是凹入表示法。

四是广义表表示法。

二、二叉树:

(简单应用)

二叉树的定义:

二叉树是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成。

二叉树的五种基本形态很容易理解。

而二叉树不是树的特殊情形,似乎不容易理解。

问题就在于二叉树是无论结点是否只有一个孩子,它都要确定是左孩子或右孩子,而度数为二的有序树虽

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

当前位置:首页 > 人文社科

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

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