数据结构知识点

.线性表、栈、队的异同点: 

相同点:逻辑结构相同,都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊

的线性表,即受限的线性表(只是对插入、删除运算加以限制)。 

不同点:① 运算规则不同: 

线性表为随机存取; 

而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO; 

队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。 

② 用途不同,线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事

件模拟、OS作业调度和简化设计等。 

第四章 

内容提要  

 串是数据元素为字符的线性表,串的定义及操作。 

串即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。 

串比较:int strcmp(char *s1,char *s2);              

求串长:int strlen(char *s);                            

串连接:char  strcat(char *to,char *from)     

子串T定位:char strchr(char *s,char *c);    

 串的存储结构,因串是数据元素为字符的线性表,所以存在“结点大小”的问题。 

模式匹配算法  

 

 串有三种机内表示方法: 

模式匹配算法  

算法目的:确定主串中所含子串第一次出现的位置(定位) 

定位问题称为串的模式匹配,典型函数为Index(S,T,pos)

BF算法的实现—即编写Index(S, T, pos)函数 

BF算法设计思想: 

将主串S的第pos个字符和模式T的第1个字符比较, 

    若相等,继续逐个比较后续字符; 

若不等,从主串S的下一字符(pos+1)起,重新与T第一个字符比较。   

直到主串S的一个连续子串字符序列与模式T相等。返回值为S中与T匹配的子序列

第一个字符的序号,即匹配成功。 

否则,匹配失败,返回值 0。 

Int Index_BP(SString S, SString T, int pos)  

{ //返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0.

 // 其中,T非空,1≤pos≤StrLength(S)  

    i=pos;      j=1;

   while ( i<=S[0] && j<=T[0] ) //如果i,j二指针在正常长度范围, 

     {    

       if (S[i] = = T[j] ) {++i, ++j; }   //则继续比较后续字符 

       else {i=i-j+2; j=1;} //若不相等,指针后退重新开始匹配 

      }

  if(j>T[0]) return i-T[0];  //T子串指针j正常到尾,说明匹配成功,  else return 0;        //

否则属于i>S[0]情况,i先到尾就不正常 

} //Index_BP

补充重点: 

1.空串和空白串有无区别? 

答:有区别。 

空串(Null String)是指长度为零的串; 

而空白串(Blank  String),是指包含一个或多个空白字符‘  ’(空格键)的字符串.

 

2.“空串是任意串的子串;任意串S都是S本身的子串,除S本身外,S的其他子串称为S

的真子串。”  

第五章 树和二叉树 

内容提要:  

 树是复杂的非线性数据结构,树,二叉树的递归定义,基本概念,术语。 

树:由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>1

时,其余的结点分为m(m≥0)个互不相交的有限集合T1,T2,…,Tm。每个集合本身又是

棵树,被称作这个根的子树 。 

二叉树:是n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左

子树和右子树的二叉树组成。 

术语:P88

 

 二叉树的性质,存储结构。 

性质1: 在二叉树的第i层上至多有2i-1个结点(i>0)。 

性质2: 深度为k的二叉树至多有2k-1个结点(k>0)。 

性质3: 对于任何一棵二叉树,若2度的结点数有n2个,则叶子数(n0)必定为n2+1  

性质4: 具有n个结点的完全二叉树的深度必为           

性质5: 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必

为2i,其右孩子编号为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)。  

二叉树的存储结构: 

一、顺序存储结构 

按二叉树的结点“自上而下、从左至右”编号,用一组连续的存储单元存储。 

若是完全/满二叉树则可以做到唯一复原。 

不是完全二叉树:一律转为完全二叉树! 

方法很简单,将各层空缺处统统补上“虚结点”,其内容为空。 

缺点:①浪费空间;②插入、删除不便   

二、链式存储结构 

用二叉链表即可方便表示。一般从根结点开始存储。 

 

优点:①不浪费空间;②插入、删除方便      

 

 二叉树的遍历。 

指按照某种次序访问二叉树的所有结点,并且每个结点仅访问一次,得到一个线性序列。 

遍历规则——— 

二叉树由根、左子树、右子树构成,定义为D、 L、R

若限定先左后右,则有三种实现方案: 

  DLR               LDR                   LRD

先序遍历           中序遍历               后序遍历  

 树的存储结构,树、森林的遍历及和二叉树的相互转换。 

 

 回顾2:二叉树怎样还原为树? 

 要点:逆操作,把所有右孩子变为兄弟! 

 讨论1:森林如何转为二叉树? 

 

 

 法一:① 各森林先各自转为二叉树;② 依次连到前一个二叉树的右子树上。 

 法二:森林直接变兄弟,再转为二叉树 

 讨论2:二叉树如何还原为森林? 

 要点:把最右边的子树变为森林,其余右子树变为兄弟 

树和森林的存储方式: 

树有三种常用存储方式: 

①双亲表示法     ②孩子表示法    ③孩子—兄弟表示法 

问:树→二叉树的“连线—抹线—旋转” 如何由计算机自动实现? 

答:用“左孩子右兄弟”表示法来存储即可。 

 

存储的过程就是树转换为二叉树的过程! 

   

树、森林的遍历: 

 

 ① 先根遍历:访问根结点;依次先根遍历根结点的每棵子树。 

② 后根遍历:依次后根遍历根结点的每棵子树;访问根结点。 

讨论:树若采用“先转换,后遍历”方式,结果是否一样? 

1. 树的先根遍历与二叉树的先序遍历相同;  

2. 树的后根遍历相当于二叉树的中序遍历; 

3. 树没有中序遍历,因为子树无左右之分。 

 

 

  ① 先序遍历 

若森林为空,返回; 

访问森林中第一棵树的根结点; 

先根遍历第一棵树的根结点的子树森林; 

先根遍历除去第一棵树之后剩余的树构成的森林。 

② 中序遍历 

若森林为空,返回; 

中根遍历森林中第一棵树的根结点的子树森林; 

访问第一棵树的根结点; 

中根遍历除去第一棵树之后剩余的树构成的森林。 

 二叉树的应用:哈夫曼树和哈夫曼编码。 

Huffman树:最优二叉树(带权路径长度最短的树) 

Huffman编码:不等长编码。 

树的带权路径长度: (树中所有叶子结点的带权路径长度之和) 

构造Huffman树的基本思想:权值大的结点用短路径,权值小的结点用长路径。 

构造Huffman树的步骤(即Huffman算法): 

(1) 由给定的 n 个权值{ w1, w2, …, wn }构成n棵二叉树的集合F = { T1, T2, …, Tn } (即

森林) ,其中每棵二叉树 Ti 中只有一个带权为 wi 的根结点,其左右子树均空。 

(2) 在F 中选取两棵根结点权值最小的树 做为左右子树构造一棵新的二叉树,且让新二叉

树根结点的权值等于其左右子树的根结点权值之和。 

(3) 在F 中删去这两棵树,同时将新得到的二叉树加入 F中。 

(4) 重复(2) 和(3) , 直到 F 只含一棵树为止。这棵树便是Huffman树。 

具体操作步骤: 

 

 

学习重点:(本章内容是本课程的重点) 

 二叉树性质及证明方法,并能把这种方法推广到K叉树。 

 

 二叉树遍历,遍历是基础,由此导出许多实用的算法,如求二叉树的高度、各结点的层

次数、度为012的结点数。 

 

 由二叉树遍历的前序和中序序列或后序和中序序列可以唯一构造一棵二叉树。由前序和

后序序列不能唯一确定一棵二叉树。  

 

 完全二叉树的性质。 

 

 树、森林和二叉树间的相互转换。 

 

 哈夫曼树的定义、构造及求哈夫曼编码。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值