随笔分类 - 数据结构基础
摘要:对于一个二叉树,如下图所示:我们可以有下面的假设,设叶子节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2。那么就有:n0+n1+n2=n又由于除了根节点以外,每一个结点都占有一个边,那么就有:n-1=2n2+n1综合上面的两个公式得到:叶子结点和二度结点数目关系:n0=n2+1如果这是...
阅读全文
摘要:题目:输入两个二叉树,判断树B是不是树A的子结构树结点的定义:struct TreeNode{ int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NU...
阅读全文
摘要:划分对于分治的算法设计很重要,下面就专门说一个划分的算法设计,然后再举例子说一些具体的应用。int Partition(int data[], int start, int end){ if(data == NULL) return -1; int index = RandomInRange...
阅读全文
摘要:题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。方法分析树的镜像,对于很多人来说这个东西可能很陌生,不知道这是个什么东西,未必一下子能够想出来。所以这里在设计算法的时候要利用画图的方式举一些简单的例子去了解题目的规则。算法设计(1)使用先序的方式遍历这棵二叉树,如果遍历到的结点有子节点,就交...
阅读全文
摘要:图的定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成。注意:在图结构中,不允许没有顶点,在定义中,如果V是顶点的集合,则强调了顶点集合V的有穷非空。在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。图的存储结构邻接矩阵考虑到图是由顶点和边或者弧两部分组成的...
阅读全文
摘要:对于大量的输入数据,链表的线性访问时间太慢,一般使用树这种数据结构。接下来的博客都将围绕如何利用树支持以O(logN)平均时间进行的各种搜索操作,以及如何细化优化得到最坏情况时间界O(logN)。树的具体的定义不说了,说几个重要的树的性质:一棵树是N个节点和N-1条边的集合,因为除了根节点以外的每一...
阅读全文
摘要:KMP算法实现字符串的模式匹配的时间复杂度比朴素的模式匹配好很多,但是它时间效率的提高是有前提的,那就是:模式串的重复率很高,不然它的效率也不会凸显出来。在实际的应用中,KMP算法不算是使用率很高的一个算法,但是它的核心的那点东西却是使用率很高的,那就是next前缀数组的求解思路。在这次笔记中就单独...
阅读全文
摘要:1. 引言在一个大的字符串中对一个小的子串进行定位称为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了。KMP本身不复杂,但网上绝大部分的文章把它讲混乱了。下面,咱们从暴力匹配算法讲起,随后阐述KMP的流程步骤、next 数组的简单求解、递推原理、代码求解,接着基于next 数组匹配,谈到...
阅读全文
摘要:栈和队列都是线性表:栈和队列,它们都是特殊的线性表,只不过对插入和删除操作做了限制。栈:限定仅在表尾进行插入和删除操作的线性表。队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表。栈和队列的顺序存储结构:它们都可以用线性表的顺序存储结构实现,但都存在着顺序存储的一些弊端,因此它们各自有一...
阅读全文
摘要:链队列的实现方法:队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点。空队列时,front和rear都指向头节点。注意:这里的实现是有头结点的,在队列的初始化函数中要为头结点开辟空间。链队列的...
阅读全文
摘要:队列的定义:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列的抽象数据类型:ADT 队列(Queue)Data 同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。Operation InitQueue(*Q): 初始化操作,建立一个空队列。 ...
阅读全文
摘要:栈的定义:当单链表限定只能在头部进行插入和删除操作的时候,就是链栈。同时把栈顶放在单链表的头部,使单链表的头指针和栈顶指针top合二为一,所以对于链栈,就不再需要头结点了。这时对链栈的push也就相当于单链表的头插法。同时对链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间了,对于空栈来...
阅读全文
摘要:两栈共享空间方法:数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个的栈底为数组的末端,即下标为n-1处。这样,如果两个栈增加元素,就是两端点向中间延伸。当top1 + 1 == top2 的时候为栈满。但是这只是针对两个具有相同数据类型的栈的一个设计上的技巧,这种数...
阅读全文
摘要:栈的定义和抽象数据类型栈是限定仅在表尾进行插入和删除操作的线性表。所以说栈也是线性表,栈元素具有线性关系,即前驱后继关系。其抽象数据类型:ADT 栈(Stack)Data 同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。Operation InitStack(*S): ...
阅读全文
摘要:概念:单链表的实现很好的借助了指针的作用,但是对一些早期的高级编程语言,他们没有指针,如果想实现单链表,就得用数组来代替指针。首先我们让数组的元素都是由两个数据域组成,data和cur。也就是说数组的每个下标都对应一个data和一个cur。cur相当于单链表中的next指针,存放该元素的后继在数组中...
阅读全文
摘要:线性表定义:零个或者多个数据元素的有限序列。元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继。其他每个元素都有且只有一个前驱和后继。并且数据元素的类型要相同。线性表的抽象数据类型:ADT 线性表(List)Data 线性表的数据对象集合为{a1,a2,...,an}...
阅读全文
摘要:算法相关:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作。我们不可能把所有的算法都实现,也更不可能用所有的输入逐一的验证算法,所以算法的正确性在大部分情况下都不能用程序来证明,而是用数学方法证明。好的算法,应该具有正确性、可读性、健壮性、高效率和低...
阅读全文
摘要:栈是常用的数据结构之一,下面给出一个链式栈的实现~~头文件Stack.h#ifndef Stack_H#define Stack_Htypedef int Item;typedef struct node * PNode;/*定义栈节点类型*/typedef struct node{ Item data; PNode down;}Node;/*定义栈类型*/typedef struct stack{ PNode top; int size;}Stack;/*构造一个空栈*/Stack *InitStack();/*销毁一个栈*/void DestroyStack(Sta...
阅读全文
摘要:队列是常用的数据结构之一,下面给出一个链式队列的实现:头文件Queue.h 1 #ifndef Queue_H 2 #define Queue_H 3 4 typedef int Item; 5 typedef struct node * PNode; 6 typedef struct node 7 { 8 Item data; 9 PNode next;10 }Node;11 12 typedef struct13 {14 PNode front;15 PNode rear;16 int size;17 }Queue;18 19 /*构造一个空队列*...
阅读全文
摘要:二叉树的所有的操作基本上都是跟遍历相关的,二叉树的深度遍历(先序、中序、后序)都设计栈的操作,但是二叉树的广度搜索(层次遍历)用到的就是队列的操作。注意一点,二叉树的层次的遍历要得到的结果是把所有的信息放到一个一维的数组中,还是放到一个二维的数组中。遍历结果存储到一维数组中vector PrintF...
阅读全文