数据结构
ojshilu
https://github.com/lucky521
展开
-
堆的实现 Heap
一定要注意堆排序和堆操作的区别和联系。堆的一个特点是原地操作,所以不要申请新的空间来存堆,原地操作即可。堆的最初始操作是堆的建立、堆的调整,进阶操作是堆的新元素插入和堆的元素删除。这里的插入和删除是可以对堆中的任何一个元素进行的。而堆排序实际上是堆操作的一个片面的应用,其插入和操作都是在堆的起始和末尾进行的。原创 2013-10-08 18:12:46 · 2222 阅读 · 0 评论 -
堆排序 全面总结
堆排序:虽然用到类似二叉树的思想,但是仍是原地排序。堆分为大根堆和小根堆两种。堆顶元素一定是该序列最值。对于从小到大的排序,适合采用大根堆,每轮都将堆顶的最大值与堆末元素交换。堆排序的基本思想:由于大根堆的堆顶元素是最大值,因此我每次都可以找到当时的最大值,从而达到排序的目的。具体的,先把原始序列变成堆,然后把堆顶最大值调换到尾部作为已排好序的部分(堆外),此时堆变小且被破坏,原创 2013-10-21 10:39:35 · 1319 阅读 · 0 评论 -
二叉树的先序遍历 Binary Tree Preorder Traversal
此问题是数据结构的重要问题,同时题目源自于leetcode。题目:Given a binary tree, return the preorder traversal of its nodes' values.For example:Given binary tree {1,#,2,3}, 1 \ 2 / 3retu原创 2013-11-06 19:10:52 · 1298 阅读 · 0 评论 -
二叉树的后序遍历 Binary Tree Postorder Traversal
递归方法:class Solution {public: vector postorderTraversal(TreeNode *root) { vector list; if(root == NULL) return list; postorder(root, list); return lis原创 2014-03-09 17:58:33 · 1000 阅读 · 0 评论 -
字典树Trie树的应用
问题:有若干个字符串,求他们的最长公共前缀子串。解法:该问题的一个比较好的办法是使用Trie树。因为Trie树有明显的字符串前缀特征。在查询近似前缀的时候经常用到。这里我建立了Trie树,且为了寻找最长公共前缀子串更方便,对结点加入了分支个数属性branch和出现次数属性times。这样,把所有字符串加入Trie树之后,通过根结点出发寻找单分支路径且出现次数均为字符串集个数,就可以找到结果原创 2013-10-21 10:40:30 · 1696 阅读 · 0 评论 -
链表的二路归并排序 Sort List
对于链表,想找一种时间复杂度为O(nlogn),空间复杂度O(1)的算法。Sort a linked list in O(n log n) time using constant space complexity.首先想到了归并排序,因为链表的归并不需要辅助空间。思路:和数组的二路归并基本一致。所不同的是:1、要遍历一遍才能找到中间位置。2、首尾位置都要记下来,因为链表不是原创 2014-03-12 13:43:57 · 2911 阅读 · 1 评论 -
图的深拷贝 Clone Graph
问题:Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors思路:图的复制问题、克隆问题。给你的只是图的冰山一角,就让你拷贝整张图。第一步,先遍历原图。把所有结点拿到手,构造一个邻接表头。第二步,根据原图的邻接表头,重建一个新的邻接表头。第三步,原创 2014-03-01 22:35:42 · 2440 阅读 · 0 评论 -
二叉树中增加next指针 Populating Next Right Pointers in Each Node
题目源自于leetcode。题目:Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }Populate each next pointer to point to原创 2013-11-06 20:58:02 · 1289 阅读 · 0 评论 -
树状数组 Binary Indexed Trees
树状数组,英文名称是Binary Indexed Trees,又叫二分索引树。它是由二分索引方式构建的数组。由于其索引方式的特点,该数组中蕴含了一个树,树的每个结点都是是由数组元素构成,每个结点都表示了数组部分元素值的和。把数组和树联系起来,以数组的物理存储方式来表达树的逻辑架构,这和堆类似。树状数组的构建方法:假设原先的普通数组是这样的A[0],A[1],A[2]...A[n-1原创 2013-12-27 11:03:35 · 1195 阅读 · 0 评论 -
队列的实现 queue
队列是规定一头只进、另一头只出的线性结构。其一般由循环队列实现,这样可以使得存储空间固定且快捷。因此需要申请一段固定的空间,设定队头front和队尾rear。入队操作是队头添加一个元素front+1,出队操作是队尾去除一个元素rear+1。初始条件(空队):规定front和rear在同一个位置,front == rear。一般状态:rear位于队尾元素的原创 2013-10-21 10:40:57 · 1456 阅读 · 0 评论 -
判断出入栈序列的合法性 Stack Sequence
给出一个入栈序列,一个出栈序列。判断,是否存在合法的出入栈操作,满足这样的入栈序列和出栈序列。思路:故事重现一遍,能顺利完成所有操作就存在,中间出现矛盾就不存在。所有数都要在栈里走一回。如果栈为空,没的出,只能是要入栈;如果栈顶元素不是要出栈的元素就继续入栈;如果栈顶元素是要出栈的元素,就要出栈(注意只有这样才能出栈);如果最后出栈序列的元素都出来了,栈也为空了原创 2014-03-02 20:21:14 · 2608 阅读 · 0 评论 -
B树和B树的实现 B-Tree
根据算法导论的描述。B树是一种特殊的平衡树和查找树。其主要用于磁盘内数据的存储和查找。因此,B树一般每个结点会比较大,包含许多数据关键字,最好占一个页面(page),这样存取的时候直接存取一个结点的数据。B树的基本性质(M阶):1、B树的每个叶子节点的高度均一致。2、对于非空B树,普通非根非叶节点至少有M-1个关键字(M个子女),至多2M-1个关键字(2M个子女)。根节点至少包原创 2013-09-24 09:07:45 · 1116 阅读 · 0 评论 -
图的实现和图的深度遍历 Graph's DFS
图的存储有2种方式:1、数组形式存储的邻接矩阵法2、链表形式存储的邻接表法。图的遍历方法有2种方式:1、深度优先遍历2、广度优先遍历数组形式存储的邻接矩阵法:这里我们申请一块矩阵大小的连续空间,然后用一个数组指针来操作二维数组,如edge[i][j]。int (*edge)[VERTEXNUM] = (int (*)[VERTEXNUM])malloc(si原创 2013-09-27 17:34:46 · 1216 阅读 · 0 评论 -
计算01矩阵中的0Group的数量 二维数组表示
题目源自于待字闺中的微信。题目:给定一个n*n的board里面是0或1算出里面独立的0group的数量。比如0 0 1 1 10 1 1 1 01 1 1 1 01 0 1 1 11 1 1 1 1答案:3。思路:虽然不是图,但是我仍然可以用图的DFS思想。我更没有必要用实现它对应的图。为了计数同时为了节省空间,把矩阵的元素本身来作为DFS时使用的标记量原创 2013-10-16 16:45:23 · 1946 阅读 · 0 评论 -
图的有条件的寻路 BFS_search
题目源自于9oj编号1545。题目:已知一个无向带权图,求最小整数k。使仅使用权值小于等于k的边,节点1可以与节点n连通。即,在图中寻找到一条1结点~n结点的路径,并且路径上的所有权值的最大值最小。思路:1、寻路:图的BFS或者DFS2、满足条件:路径上的最大权值最小一种方法:把每条能够到达的路径找到,且记录下这条路径上的最大权值。另一种方法:每次设定一个权原创 2013-10-15 21:26:00 · 1436 阅读 · 0 评论 -
二叉查找树的原理与实现 Binary Search Tree
二叉查找树是一种特殊的二叉树。其树结点的结构和普通二叉树一样。所不同的是,我们对二叉查找树的建立和修改操作都需要使其始终满足一个条件:对于树中的每个结点X,它的左子树中所有关键字值小于X的关键值,而它的右子树中所有关键字大于X的关键值。 正是这个条件二叉查找树的建立和修改操作和普通二叉树不一样,需要按照一定的规则。这一规则赋予二叉查找树一些性质。二叉查找树具有的性质:1、二叉查找原创 2013-10-31 19:27:50 · 1623 阅读 · 0 评论 -
图的实现和图的广度遍历 Gragh's BFS
图的实现方法有2种,在之前的一篇博文图的深度遍历中有介绍。在同样的2种图的存储方式的基础上,可以进行图的广度遍历。图的邻接矩阵法,依然是申请完全连续的空间。通过二维数组空间来存储和访问图中每个边的存在性(或权值)。int (*edge)[VERTEXNUM] = (int (*)[VERTEXNUM])malloc(sizeof(int)*VERTEXNUM*VERTE原创 2013-10-21 10:42:23 · 1029 阅读 · 0 评论 -
逆转链表 Reverse Linked List
#include#include#includeusing namespace std;typedef struct node{ int data; struct node *next;}node,*List;int main(){ List head = NULL; node *n; int input; cin>>input; while(input != -原创 2013-07-12 15:43:22 · 1394 阅读 · 0 评论 -
Hash表的一种实现
Hash是在数据统计和海量数据处理中经常使用到的一个方法和数据结构。Hash支持的外部操作:插入新数据、查找数据。(一般不支持删除数据)Hash的使用包括两个重要部分:一个是Hash函数,一个是存储方法。Hash函数:把数据集的一个单元转换成hashID。比如要存储一个个字符串,就需要把字符串转换为hashID。存储方法:如何组织数据集的数据。这里涉及到一个问题就是,相同h原创 2014-02-17 09:56:57 · 923 阅读 · 0 评论 -
用栈实现队列,用队列实现栈 Queue Using Stacks and Stack Using Queues
栈的结构是先入后出。队列的结构是先入先出。用两个栈实现一个队列的一种方法:出队:对于栈中的元素,最里面的是最早放进去的。而要出队的就是最早的元素,所以需要把栈里的元素全腾出来放另一个栈中,这样最早的元素就成为另一个栈的最外面的元素,可以直接拿走出队。入队:出队操作使得会使得栈的顺序逆置,因此我要先逆回来,让最早放进去的元素还在最里面。Stack in;Stack原创 2013-12-22 21:08:37 · 1102 阅读 · 0 评论 -
二叉树的中序遍历 Binary Tree Inorder Traversal
方法:二叉树的先序遍历形式有递归和非递归两种。递归方式的实现:class Solution {public: vector inorderTraversal(TreeNode *root) { vector out; fun(root, out); return out; } void fun(Tree原创 2014-02-17 14:34:39 · 1050 阅读 · 0 评论