
数据结构
文章平均质量分 71
Kinglliam
这个作者很懒,什么都没留下…
展开
-
表的游标实现
所谓游标就是指示数组单元地址的下标值,它属整数类型。我们可以用游标来模拟指针,将TElement类型的元素所组成的表用一个数组来实现,数组单元是记录类型,记录中包含一个表元素和一个作为游标的整数;具体说明如下:VarSPACE: array[1..maxlength] of record转载 2006-05-04 16:05:00 · 1500 阅读 · 0 评论 -
双链表
在单循环链表中,虽然从任一单元出发,可以找到其前驱单元,但需要O(n)时间。如果我们希望能快速确定表中任一元素的前驱和后继元素所在的单元,可以在链表的每个单元中设置两个指针,一个指向后继,另一个指向前驱,形成图8所示的双向链表或简称为双链表。图8 双链表 由于在双链表中可以直接确定一个单元的前驱单元和后继单元,我们可以用一种更自然的方式表示元素的位置,即用指向双链表中第i转载 2006-05-04 16:08:00 · 1800 阅读 · 0 评论 -
栈的数组实现
由于栈是一个特殊的表,我们可以用数组来实现栈。考虑到栈运算的特殊性,我们用一个数组elements[1..maxlength]来表示一个栈时,将栈底固定在数组的底部,即elements[1]为最早入栈的元素,并让栈向数组上方(下标增大的方向)扩展。同时,我们用一个游标top来指示当前栈顶元素所在的单元。当top=0时,表示这个栈为一个空栈。在一般情况下,elements中的元素序列elements转载 2006-05-04 16:10:00 · 2396 阅读 · 0 评论 -
栈的指针实现
在算法中要用到多个栈时,最好用链表作为栈的存储结构,即用指针来实现栈。用这种方式实现的栈也称为链栈,见图4。由于栈的插人和删除操作只在表头进行,因此用指针实现栈时没有必要像单链表那样设置一个表头单元。图4 链栈栈的类型说明与单链表类似。 type TNode=record转载 2006-05-04 16:11:00 · 2147 阅读 · 0 评论 -
用指针实现队列
与栈的情形相同,任何一种实现表的方法都可以用于实现队列。用指针实现队列得到的实际上是一个单链表。由于入队在队尾进行,所以用一个指针来指示队尾可以使入队操作不必从头到尾检查整个表,从而提高运算的效率。另外,指向队头的指针对于Front和Dequeue运算也是必要的。为了便于表示空队列,我们仍使用一个表头单元,将队头指针指向表头单元。当队头和队尾指针都指向表头单元时,表示队列为一个空队列。用指针实转载 2006-05-04 16:20:00 · 2060 阅读 · 1 评论 -
树的父亲数组表示法
设T是一棵树,表示T的一种最简单的方法是用一个一维数组存储每个结点,数组的下标就是结点的位置指针,每个结点中有一个指向各自的父亲结点的数组下标的域,这样可使Parent操作非常方便。类型定义如下: Type TPosition=integer; {结点的位置类型为整型}转载 2006-05-04 16:29:00 · 5385 阅读 · 0 评论 -
树的儿子链表表示法
树的另一种常用的表示方法就是儿子链表表示法。这种表示法用一个线性表来存储树的所有结点信息,称为结点表。对每个结点建立一个儿子表。儿子表中只存储儿子结点的地址信息,可以是指针,数组下标甚至内存地址。由于每个结点的儿子数目不定,因此儿子表常用单链表来实现,因此这种表示法称为儿子链表表示法。这种实现法与图的邻接表表示法类似。下图是一个儿子链表表示法的示意图。图3 树的儿子链表实现图3转载 2006-05-04 16:34:00 · 7169 阅读 · 0 评论 -
二叉树的结点度表示法
二叉树的顺序存储结构可看作是二叉树的一种无边表示,即树中边信息是隐含的。二叉树的另一种无边表示称为二叉树的结点度表示。这种表示法将二叉树中所有结点依其后序列表排列,并在每个结点中附加一个0到3之间的整数,以表示结点的状态。该整数为0时,表示相应的结点为一叶结点;为1时,表示相应结点只有一个左儿子;为2时,表示相应结点只有一个右儿子;为3时,表示相应结点有两个儿子。例如,图9(a)中的二叉树的结点度转载 2006-05-04 16:47:00 · 8123 阅读 · 2 评论 -
二叉树的链式存储结构
由于二叉树的每个结点最多有两个儿子,因此存储二叉树的最自然的方法是链接的方法。在用链接方式存储二叉树时,对于每个结点,除了存储结点标号等信息外,还应设置指向结点左右儿子的指针LeftChild和RightChild。结点的类型说明为: Type TPosition=^NodeTy转载 2006-05-04 16:48:00 · 3073 阅读 · 0 评论 -
表的指针实现
实现表的另一种方法是用指针将存储表元素的那些单元依次串联在一起。这种方法避免了在数组中用连续的单元存储元素的缺点,因而在执行插入或删除运算时,不再需要移动元素来腾出空间或填补空缺。然而我们为此付出的代价是,需要在每个单元中设置指针来表示表中元素之间的逻辑关系,因而增加了额外的存储空间的开销。 为了将存储表元素的所有单元用指针串联起来,我们让每个单元包含一个元素域和一个指针域,其中的指针指转载 2006-05-04 16:02:00 · 1170 阅读 · 0 评论 -
表的数组实现
将一个表存储到计算机中,可以采用许多不同的方法,其中既简单又自然的是顺序存储方法,即将表中的元素逐个存放于数组的一些连续的存储单元中。在这种表示方式下,容易实现对表的遍历。要在表的尾部插入一个新元素,也很容易。但是要在表的中间位置插入一个新元素,就必须先将其后面的所有元素都后移一个单元,才能腾出新元素所需的位置。执行删除运算的情形类似。如果被删除的元素不是表中最后一个元素,则必须将它后面的所有元素转载 2006-05-04 16:00:00 · 1911 阅读 · 0 评论 -
用循环数组实现队列
我们可以将队列当作一般的表用数组加以实现,但这样做的效果并不好。尽管我们可以用一个游标last来指示队尾,使得Enqueue运算可在O(1)时间内完成,但是在执行Dequeue时,为了删除队头元素,必须将数组中其他所有元素都向前移动一个位置。这样,当队列中有n个元素时,执行Dequeue就需要O(n)时间。为了提高运算的效率,我们用另一种方法来表达数组中各单元的位置关系。设想数组Q[1..Ma转载 2006-05-04 16:16:00 · 4261 阅读 · 1 评论 -
树的左儿子右兄弟表示法
树的左儿子右兄弟表示法又称为二叉树表示法或二叉链表表示法。每个结点除了data域外,还含有两个域,分别指向该结点的最左儿子和右邻兄弟。这种表示法常用二叉链表实现,因此又称为二叉链表表示法。但是实际应用中常用游标(静态链表)来代替链表,请参见表的游标实现。若用指针实现,其类型定义为: Type转载 2006-05-04 16:36:00 · 10600 阅读 · 0 评论 -
线索二叉树
当用二叉链表作为二叉树的存储结构时,因为每个结点中只有指向其左、右儿子结点的指针,所以从任一结点出发只能直接找到该结点的左、右儿子。在一般情况下靠它无法直接找到该结点在某种遍历序下的前驱和后继结点。如果在每个结点中增加指向其前驱和后继结点的指针,将降低存储空间的效率。我们可以证明:在n个结点的二叉链表中含有n+1个空指针。因为含n个结点的二叉链表中含有个指针,除了根结点,每个结点都有一个从父结转载 2006-05-04 16:49:00 · 3387 阅读 · 1 评论 -
果园或森林的二叉树表示
从树的左儿子右兄弟表示法和二叉树的链式表示法可知,一般树和二叉树都可以用二叉链表作为其存储结构。因此,以二叉链表为媒介可以将一棵一般树转换为一棵二叉树。例如,图11(a)中的树可转化为图11(b)中的二叉树,它们具有相同的二叉链表表示。(a)(b)图11 将一棵树转化为二叉树由树的左儿子右兄弟表示法可知,与其对应的二叉树根结点的右子树必为空树。因此,如果我们将一个果园中的所转载 2006-05-04 16:59:00 · 2387 阅读 · 0 评论 -
用指针实现队列
与栈的情形相同,任何一种实现表的方法都可以用于实现队列。用指针实现队列得到的实际上是一个单链表。由于入队在队尾进行,所以用一个指针来指示队尾可以使入队操作不必从头到尾检查整个表,从而提高运算的效率。另外,指向队头的指针对于Front和Dequeue运算也是必要的。为了便于表示空队列,我们仍使用一个表头单元,将队头指针指向表头单元。当队头和队尾指针都指向表头单元时,表示队列为一个空队列。用指针实转载 2006-05-04 16:18:00 · 2252 阅读 · 0 评论 -
树的遍历
树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的系统的访问,即依次对树中每个结点访问一次且仅访问一次。树的3种最重要的遍历方式分别称为前序遍历、中序遍历和后序遍历。以这3种方式遍历一棵树时,若按访问结点的先后次序将结点排列起来,就可分别得到树中所有结点的前序列表,中序列表和后序列表。相应的结点次序分别称为结点的前序、中序和后序。树的这3种遍历方式可递归地定义如下:转载 2006-05-04 16:38:00 · 2197 阅读 · 1 评论 -
二叉树的顺序存储结构
此结构是将二叉树的所有结点,按照一定的次序,存储到一片连续的存储单元中。因此,必须将结点排成一个适当的线性序列,使得结点在这个序列中的相应位置能反映出结点之间的逻辑关系。这种结构特别适用于近似满二叉树。在一棵具有n个结点的近似满二叉树中,我们从树根起,自上层到下层,逐层从左到右给所有结点编号,就能得到一个足以反映整个二叉树结构的线性序列,如图6所示。其中每个结点的编号就作为结点的名称。转载 2006-05-04 16:44:00 · 6367 阅读 · 1 评论 -
二叉树的数学性质
二叉树具有以下的重要性质: 高度为h≥0的二叉树至少有h+1个结点; 高度不超过h(≥0)的二叉树至多有2h+1-1个结点; 含有n≥1个结点的二叉树的高度至多为n-1; 含有n≥1个结点的二叉树的高度至少为logn,因此其高度为Ω(logn)。 具有n个结点的不同形态的二叉树的数目在一些涉及二叉树的平均情况复杂性分析中是很有用的。设Bn是转载 2006-05-04 16:55:00 · 1660 阅读 · 0 评论 -
循环链表
我们在用指针实现表时,表中最后一个元素所在单元的指针域(next)为空指针nil。如果将这个空指针改为指向表头单元的指针就使整个链表形成一个环。这种首尾相接的链表称为循环链表。在循环链表中,从任意一个单元出发可以找到表中其他单元。图6所示的是一个单链的循环链表或简称为单循环链表。转载 2006-05-04 16:07:00 · 1596 阅读 · 0 评论 -
特殊形态的二叉树
满二叉树和近似满二叉树是二叉树的两种特殊情形。一棵高度为h≥0且有2h+1-1个结点的二叉树称为满二叉树。若一棵二叉树至多只有最下面的两层结点的度数小于2,并且最下面一层结点都集中在该层的最左边,则称这种二叉树为近似满二叉树(有时也称为完全二叉树)。(a) 满二叉树(b) 近似满二叉树(c) 非近似满二叉树图5 特殊形态的二叉树例如图5(a)转载 2006-05-04 16:57:00 · 1820 阅读 · 0 评论