数据结构笔记上篇

第一章:数据结构

1,数据对象:是性质相同的数据元素的集合,是数据的子集。

2,数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

数据结构分为逻辑结构和物理结构,

逻辑结构:是指数据对象中数据元素之间的相互关系,分为四种,集合、线性、树、图。

集合,集合结构中的数据元素除了同属于一个集合外,他们之间没有其他关系。

线性,线性结构中的数据元素之间是一对一的关系。

树,树形结构中的数据元素之间存在一种一对多的层次关系。

图,图形结构的数据元素是多对多的关系。

物理结构(存储结构):是指数据的逻辑结构在计算机中的存储形式。数据元素的存储结构形式有两种,顺序存储和链式存储。

顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。

 

3,算法的五个基本特性:输入,输出,有穷性,确定性,和可行性。

第三章:线性表

线性表:零个或多个数据元素的有限序列;

若将线性表记为(a1,...,ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接后继元素,当i=1,2,...,n-1时,ai有且仅有一个直接后继,当i=2,3,...,n时,ai有且仅有一个直接前驱。n=0时,成为空表。

线性表的两种物理结构

第一种:顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

/*定义存储空间的初始分配量*/
/*元素类型根据实际情况而定,可以定义为int*/
/*
    //定义数组存储数据元素,最大值为存储空间的初始分配量
    //线性表的当前长度 int length;
*/

线性表顺序存储结构的优缺点

优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间,可以快速的存取表中任一位置的元素。

缺点:插入和删除操作需要移动大量元素,当线性表长度变化较大时,难以确定存储空间的容量,造成存储空间的碎片。

第二种:链式存储结构:单链表,静态链表,循环链表,双向链表, 

第四章:栈和队列

是限定仅在表尾进行插入和删除操作的线性表,

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

栈:先进后出,后进先出。

允许插入和删除的一端称为栈顶,另一端称为栈底。不含任何数据元素的栈称为空栈。简称LIFO结构。

表尾即是指栈顶,栈的插入操作叫作进栈,也称压栈,入栈。栈的删除操作叫作出栈,

栈的顺序存储和链式存储

栈的顺序存储结构

定义一个top变量来指示栈顶元素在数组中的位置,top可以变大变小,栈顶位置必须小于存储栈的长度stacksize,当栈存在一个元素时,top等于0,因此通常把空栈的判定条件定为top等于-1;

用一个数组来存储两个栈,增加空间利用率。将一个栈的栈底作为数组的始端,另一个栈的栈底作为数组的末端,top1表示栈1的栈顶,top2表示栈2的栈顶,当top1=-1时,表示栈1为空,当top2=n时栈2为空栈。当top1 + 1=top2时,为栈满。栈1进栈表示top1 + 1,栈2进栈表示top2-1;这样的数据结构通常都是当两个栈的空间需求有相反关系时,也就是一个栈增长,另一个栈在缩短的情况,就像买卖股%%%piao,你买入时,一定是有人在卖出。

栈的链式存储结构

栈顶放在单链表的头部,通常对于链栈是不需要头节点的。链栈一般不存在栈满的情况,对于空栈,即是top=null的时候。

利用栈进行四则运算表达式求值;

1后缀表达式:所有的符号都是在要运算数字的后面出现。

中缀表达式:平时所用的标准四则运算表达式称为中缀表达式。

中缀表达式转后缀表达式,规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号,则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

队列:是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出的线性表,简称FIFO,允许插入的一端称为队尾,允许删除的一端称为队头。队列作为一种特殊的线性表,同样存在两种存储方式,

队列的顺序存储方式和线性表的顺序存储结构完全相同,

循环队列解决假溢出的现象,

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出,简称为链队列。

第五章:字符串

第六章:树

树是n(n>=0)个结点的有限集,n=0时称为空树。在任意一棵非空树中,1,有且仅有一个特定 的称为根的结点;2,当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,T3....,Tm,其中每个集合本身又是一棵树,并且成为根的子树。

注意:n>0时根结点是唯一的,不可能存在多个根结点。m>0时,子树的个数没有限制,但他们一定是互不相交的。

结点的层次,从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的深度或高度。

结点的分类,结点拥有的子树数称为结点的度,度为零的结点称为叶结点或终端结点,度不为零的结点称为非终端结点或分支结点,除根结点外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。

树的存储结构:

1,双亲表示法,假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置,也就是说,每个结点除了知道自己是谁以外,还知道它的双亲在哪里。

结点结构是:data |  parent  ,其中data是数据域,存储结点的数据信息,而parent是指针域,存储该结点的双亲在数组中的下标。还可以增加一个结点最左边孩子的域,又名长子域,如果没有孩子的结点,这个长子域就设置为-1,;还可以增加一个右兄弟域来体现兄弟关系,也就是说每个结点如果它存在右兄弟,则记录下右兄弟的下标,如果右兄弟不存在,则赋值为-1.

2,孩子表示法,由于树中每个结点可能有多棵子树,可以考虑用多重链表,即每个结点右多个指针域,其中每个指针指向一棵子树的根结点,这种方法叫做多重链表表示法。

3,孩子兄弟表示法,任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟存在也是I唯一的,因此可以设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。

二叉树的定义:

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

二叉树的特点:1,每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点,注意不是只有两棵子树,而是最多有,没有子树或者有一棵子树也是可以的;2,左子树和右子树是有顺序的,次序不能任意颠倒;3, 即使树中每个结点只有一棵子树,也要区分它是左子树或者右子树。

二叉树的五种基本形态,空二叉树、只有一个根结点、根结点只有左子树、根结点只有右子树、根结点既有左子树又有右子树。

特殊二叉树:

1斜树,所有的结点都只有左子树叫左斜树,所有的结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。

2满二叉树,在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。

满二叉树的特点,叶子只能出现在最下一层,出现在其他层就不可能达成平衡;非叶子结点的度一定是2,;在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。

3完全二叉树,对一棵具有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树中的编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。满二叉树一定是一棵完全二叉树,但完全二叉树不一定是满的。

完全二叉树的特点,叶子结点只能出现在最下两层;最下层的叶子一定集中在左部连续位置;如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况;倒数第2层,若有叶子结点,一定都在右部连续位置;同样结点数的二叉树,完全二叉树的深度最小。

二叉树的性质

1,在二叉树的第i层上至多有2的(i-1)次方个结点。

2,深度为K的二叉树至多有2的k次方减1个结点。

3,对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 +1。

4,具有n个结点的完全二叉树的深度为log以2为底n的对数向下取整,然后再+1.

。。。。

二叉树的存储结构:

顺序存储结构一般只用于完全二叉树,

二叉链表,二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针,我们称这样的链表叫作二叉链表。

二叉树的遍历:

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。

1,前序遍历,规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

2,中序遍历,规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。

3,后序遍历,规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。

4,层序遍历,规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。

 

赫夫曼树及其应用

赫夫曼编码,最基本的压缩编码方式。

 

转载于:https://my.oschina.net/ykduan/blog/1503019

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值