数据结构 - 线性表

线性表

线性表(Linear list)

     线性表是n个类型相同的数据元素的有限数列

     如:(a0,a1,…,ai-1,ai,ai+1,…,an+1)

  一、特点

    1、相同数据类型

          要求线性结构中所有数据元素具有相同的属性

          如:(1,2,45,444,777)都是数字

              (A,B,ZGH)都是字母

    2、序列(顺序性)

         在线性表的相邻数据元素之间存在着序列关系

         除了唯一的表头元素和表尾元素以外,其他所元素都有唯一的直接前驱和直接后驱

    3、有限

         线性表中的数据元素的个数n定义为线性表的长度

         n是一个有限值,当n=0时线性表是一个空表

         数据元素序号的范围时[0,n-1]

 二、线性表及其结构

    1、顺序结构存储:

       特点:在内存中分配连续空间,只存储数据,不存储地址信息,位置隐含地址值

       优点:节省存储空间,索引查找效率高

       缺点:插入删除操作需要移动元素比较麻烦;必须提前分配定量空间,否则会造成空间不够或者空间浪费的情况;因为需要逐个比较,所以内容查询效率低

    2、链式结构存储:

       特点:数据存储是不连续的存储空间,每个存储节点对应一个需要存储的数据元素,每个元素由数据域和指针域组成,元素之间的逻辑关系通过存储节点之间的链接关系反应出来

       优点:1、插入、删除操作灵活

             2、有元素的情况下分配节点空间

       缺点:比顺序结构的存储密度小;查找效率低

             (每个节点地址不连续、无规律)

栈(Stack)

  又称堆栈,是运算受限的线性表;

  其限制是仅允许在表的一端进行操作和操作;

  表中进行插入、删除操作的被称作栈(top),另一端被称为栈底(bottom);

  当栈中没有元素时被称为空栈,向一个栈插入元素又称为入栈或者进栈;

  从一个栈中删除元素称为出栈或者退栈;

  由于栈的插入和删除操作仅在栈顶进行,后进栈的元素必定先出栈;

  所以又把堆栈称为后进先出表(Last In FirstOut)。

栈的存储结构:

  堆栈也有两种基本的存储结构:

    顺序存储结构

    链式存储结构

顺序栈:

  是指使用顺寻存储结构实现的堆栈,

  即利用一组地址连续的存储单元依次存放堆栈中的数据元素

  在线性表的顺序存储基础上,选择数组下标大的一端作为栈顶

  即线性表顺序存储的表尾,此时入栈、出栈等操作的时间复杂度时O(1)。

  在顺序栈的实现过程中需要创建一个指针top,来动态的指示栈顶元素在数组中的位置

  top=-1时表示空栈。

链栈:

  是采用链表作为存储结构实现的栈。

  采用单链表存储线性表后,根据单链表的操作特性选择单链表的头部作为栈顶

  此时,出入栈操作可在O(1)内完成

  由于栈的操作只在线性表的一端进行,使用单链表时带头节点或者不带头节点都行。

队列(queue)

  简称队,同堆栈一样,也是一种运算受限的线性表

  仅允许在表的一端进行插入,在表的另一端进行删除,

  将插入数据元素的一端称为队尾(rear),删除数据元素的一端称为队首(fron)。

  向队尾插入元素称为进队或者入队,新元素入队后成为新的队尾元素。从队列删除元素称为离队或出队,元素出对后,其后续元素成为新的队首元素。

  先进队的元素必先离队,先进先出表(First In First Out)。

  队列的存储结构:

  顺序存储结构:

    1、使用数组作为存储结构

    2、使用循环数组作为存储结构

  链式存储结构:

    链式队列,使用单链表来实现链式存储。

    为了操作实现方便,这里采用带头结点的单链表结构。

    根据单链表的特点,选择链表的头部作为队首,链表的尾部作为队尾。

双端队列

  指两端都可以进行进队和出队的队列,将队列的两端分别称为前端和后端,两端都可以入队和出队。

  底层逻辑结构仍是线性结构

  双端队列既可以用来对列操作,也可以用来实现栈操作(只操作一端就是栈了)

树(tree)

  树是由一个集合以及在该集合上定义的一种关系构成的结构。

  集合中的元素称为树的结点,所定义的关系称为父子关系

  父子关系在树的结点之间建立了一个层次结构

  树的结点包含一个数据元素及若干个指向其子树的若干分支,这个数据元素结点称为该树的根结点,或简称为树根(root,结点拥有的子树的数目称为结点的度(Degree)度为0的结点称为叶子(leaf)结点或者终端结点,度不为0的结点称为非终端结点或分支结点,除根之外的分支结点也称为内部结点,树内各结点的度最大值称为树的度,树中结点的最大层次数称为树的深度(depth)或者高度。

有序树:

  将树中结点的各子树看成从左至右依次是有次序的,则该树为有序树,若不考虑子树的顺序则称为无序树

m叉树:

  树中所有结点最大度数为m的有序树

森林(forest):

  是m棵互不相交的树的集合(可以是0棵树),对树中每个结点而言,其子树的集合即为森林。

二叉树(binary tree)

   每个结点的度均不超过2的有序树,称为二叉树(binary tree)

   二叉树或者是一棵空树,或者是一棵由一个根结点和两棵互不相交的分别称为根的左子树和右子树的子树所组成的非空树

   二叉树里每个结点的孩子结点值只能是: 0、1、2

(满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树)

二叉树的性质

 性质1∶在二叉树的第i层上最多有2^(i-1)个结点(根是第1层)

 性质2∶高度为h的二叉树至多有2^h-1个结点

 性质3∶对任何一棵二叉树T,如果其终端(叶子)结点数为n0,度为2的结点数为n2,则n0=n2+1

 性质4∶有n个结点的完全二叉树的高度为[log2𝑛]+1,其中[log2𝑛]是向下取整;

 性质5∶含有n>=1个结点的二叉树的高度至多为n-1;

        高度至少为[log2𝑛]+1,其中[log2n]是向下取整;

 性质6∶如果对一棵有n个结点的完全二叉树的结点进行编号,则对任一结点i(1≤i≤n),有

 (1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲结点PARENT(i)是结点 [i/2]                

 (2)如果2i>n,则结点i无左孩子;否则其左孩子是结点2i

 (3)如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1

顺序存储结构

   满二叉树和完全二叉树来说,可以将其数据元素逐层存放到- -组连续的存储单元中,高效方便。

   因为满二叉树和完全二叉树采用顺序存储结构,既不浪费空间,还可以根据公式快速确定结点之间的关系。

   但是对于一般的二叉树而言,必须用"虚结点"将一棵二叉树补成-棵完全二叉树来存储,否则无法确定结点之间的前驱后续关系,造成空间的浪费。

   使用“虚结点”,造成运算时间浪费。所以一般不用顺序结构存储树结构内容。

链式存储结构

   二叉树的链式存储结构

   设计不同的结点结构可构成不同的链式存储结构

   根据二叉树特性,设计每个结点至少包括3个域:

   数据域、左孩子域和右孩子域。

   数据域存放数据元素,左孩子域存放指向左孩子

   此存储结构称为二叉链表。

   为了方便找到父结点,可以在上述结点结构中

   增加一个指针域,指向结点的父结点,此存储结构称为三叉链表。

遍历(Trarverse)

  按照某种次序访问树中所有节点,且每个节点恰好访问一次。

四种主要的遍历思想为:

先序遍历DLR:根结点 ---> 左子树 ---> 右子树

中序遍历LDR:左子树 ---> 根结点 ---> 右子树

后序遍历LRD:左子树 ---> 右子树 ---> 根结点

层次遍历:只需按层次遍历即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值