
数据结构
文章平均质量分 77
mi_rencontre
这个作者很懒,什么都没留下…
展开
-
二叉树
二叉树: 二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。满二叉树: 高度为N的满二叉树有2^N - 1个节点的二叉树。完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。前序遍历(先根遍历):(1):先访问根节点;原创 2016-03-21 08:43:50 · 412 阅读 · 0 评论 -
并查集的实现
并查集(UnionFind):将N个不同的元素分成一组不相交的集合。 开始时,每个元素就是一个集合,然后按规律将两个集合进行合并。 应用场景:假如已知有n个人和m对好友关系(存于数组r),如果两个人是直接的或间接的好友关系(好友的好友的好友....)原创 2016-05-13 22:17:51 · 725 阅读 · 0 评论 -
图的存储
图 : 是一种线性结构,由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构。图的存储:临接矩阵:将所有的顶点的信息组织成一个顶点表,然后利用矩阵来表示各顶点之间的临接关系,称为临接矩阵。邻接表:使用数组存储顶点集合,使用链表链接边的关系。图的邻接矩阵存储实现代码:#pragma once#includetemplateclass GraphMatrix{原创 2016-05-17 10:44:35 · 1634 阅读 · 0 评论 -
C++项目之文件的压缩及解压缩
项目描述:实现文件的压缩机解压缩。 开发平台:VS2013 开发技术:堆,Huaffman树,文件输入输出函数 项目特点:1. 统计文件中字符出现的次数,利用数据结构堆建造Huffman树,出现次数多的编码短,出现次数少的编码长。 2. 根据建造好的Huffman树形成编码,以对文件进行压缩。 3.将文件中出原创 2016-04-19 15:54:24 · 5942 阅读 · 0 评论 -
B树的实现
B树:1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树。(有些地方写的是B-树,注意不要误读 成"B减树") 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:1. 根节点至少有两个孩子 2. 每个非根节点有[ (M/2)向上取整 ,M]个孩子3. 每个非根节点有[ (M/2)向上取整 -1,M-原创 2016-05-07 11:41:35 · 2084 阅读 · 0 评论 -
链表相关笔试题(一)
1.从尾到头打印单链表方法一:可以用栈实现,遍历链表,每经过一个结点,把该结点放入栈中,当遍历完整个链表后,从栈顶开始逐个输出结点的值,此时输出的结点的顺序就反转过来了实现代码:原创 2016-05-01 12:55:25 · 446 阅读 · 0 评论 -
布隆过滤器的简易实现
布隆过滤器(Bloom Filter): 是由布隆(Burton Howard Bloom)提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器用于检索一个元素是否在一个集合中。底层是利用哈希表来实现的,它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是原创 2016-05-08 16:41:22 · 3239 阅读 · 4 评论 -
处理哈希冲突的开链法(哈希桶)
处理哈希冲突的另一种方法:开链法原创 2016-04-08 17:28:51 · 1423 阅读 · 0 评论 -
比较排序算法
常用的排序算法有: 直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序等。原创 2016-04-08 12:08:09 · 470 阅读 · 0 评论 -
图的遍历、最小生成树以及单源最短路径
图的遍历主要分为两种:深度优先遍历(DFS)和广度优先遍历(BFS)DFS:深度优先遍历:和树的前序遍历相似,首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上原创 2016-05-22 17:03:12 · 4189 阅读 · 0 评论 -
二叉树相关笔试题(三)
1.按之字形顺序打印二叉树题目:请实现一个函数,按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二行按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,以此类推。分析:可以用两个栈,在打印某层结点时,把下一层的子结点保存到相应的栈里。如果当前层是奇数层,则先保存左子节点再保存右子结点到第一个栈中,如果是偶数层,则先保存右子结点再保存左子节点到第二个栈中。原创 2016-05-22 11:35:12 · 551 阅读 · 0 评论 -
二叉树相关笔试题(二)
1.二叉树中和为某一值的路径题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整树的所有路径。从树的根节点开始往下直到叶节点所经的结点形成一条路径。分析:由于路径是从根节点出发的,所以选择前序遍历,当访问到一个结点时,把该结点添加到路径,并累加该结点的值,如果该结点为叶子结点并且路径中结点值的和刚好等于输入的整数,则该路径符合要求,如果当前结点不是叶子结点,则继续访问它的子节点原创 2016-05-13 11:59:14 · 1862 阅读 · 0 评论 -
稀疏矩阵的压缩存储与转置
稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。原创 2016-03-22 08:36:08 · 667 阅读 · 0 评论 -
红黑树的实现
红黑树:红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单 路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。性质:1. 每个节点,不是红色就是黑色的 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的原创 2016-04-30 10:11:55 · 553 阅读 · 0 评论 -
广义表
广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。#includeusing namespace std;#include enum Type{ HEAD, VALUE, SUB,};struct GeneralListNode{ Type _type; GeneralL原创 2016-03-21 09:36:03 · 392 阅读 · 0 评论 -
位图的实现
应用场景:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。思路:如果内存够的话,40亿个整型使用位图存储需要500M左右的空间。#include using namespace std; #includeclass Bitmap{public: Bitmap() : _size(0) {} Bitm原创 2016-04-03 16:04:52 · 994 阅读 · 0 评论 -
线索化二叉树
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。 #includeusing namespace std;#include原创 2016-04-03 16:59:27 · 399 阅读 · 0 评论 -
哈希表(hashtable)
HashTable: 哈希表/散列表,是根据关键字(key)直接访问数据的数据结构。它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表。构造哈希表的几种方法1.直接定址法--取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。2原创 2016-04-08 17:24:55 · 693 阅读 · 0 评论 -
堆的实现
堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。堆结构的二叉树存储是最大堆:每个父节点的都大于孩子节点。最小堆:每个父节点的都小于孩子节点。 实现代码如下:#include using namespace std;#include #includetemplatestruct原创 2016-04-13 20:10:57 · 451 阅读 · 0 评论 -
非比较排序
非比较排序有:1.计数排序(适用于要排序的数的范围不大时) ,以数组中的数据为key值,得到它们出现的次数, 然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。 2.基数排序 LSD-- Least Significant Digit first原创 2016-04-10 13:50:46 · 377 阅读 · 0 评论 -
栈与队列相关笔试题
1.用两个栈实现队列分析:队列的特点是“先进先出”,而栈的特点是“后进先出”,入队列时让所有的元素进到stack1中,出队列时先判断stack2是否为空,不为空直接pop即可,若为空,将stack1中所有的元素“倒入”stack2中,这样就用两个栈实现了队列。实现代码:class Solution{public: void push(int node) {原创 2016-05-10 15:07:55 · 1641 阅读 · 0 评论 -
二叉搜索树的实现
二叉搜索树的性质:1.每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。2.左子树上所有节点的关键码(key)都小于根节点的关键码(key)。3.右子树上所有节点的关键码(key)都大于根节点的关键码(key)。4.左右子树都是二叉搜索树。实现代码如下:#includeusing namespace std;templatestruct BS原创 2016-04-15 15:49:54 · 394 阅读 · 0 评论 -
二叉树相关笔试题(一)
1.根据二叉树的前序遍历和中序遍历的结果重建二叉树分析:二叉树的前序遍历顺序是根->左->右,中序遍历顺序是左->根->右,由此可以看出在前序遍历中的第一个数字为二叉树的根节点,接着扫描中序遍历的结果就可以得到根结点的位置,在根节点左边的数为左子树结点的值,位于根节点右边的为右子树结点的值,接下来可以用递归的方法分别构建左右子树。原创 2016-05-11 11:41:37 · 629 阅读 · 0 评论 -
AVL树的实现
AVL树: AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel'son-Vel'skii和E.M.Landis提出来的。它能保持二叉树的高度 平衡,尽量降低二叉树的高度,减少树的平均搜索长度。性质:1. 左子树和右子树的高度之差的绝对值不超过1 2. 树中的每个左子树和右子树都是AVL树 3. 每个节点都有一个平原创 2016-04-29 22:54:11 · 509 阅读 · 0 评论 -
链表相关笔试题(二)
1.复杂链表的复制题目:请实现函数,复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个pSibling指向链表中的任意结点或者NULL。方法一:先复制原始链表上的每一个结点,并用next链接起来,然后设置每个节点的pSibling指针。假设原始链表中的某个结点N的pSibling指向结点S,由于S的位置在链表中可能在N的前面也可能在N的后面,所以要定位原创 2016-05-07 12:45:18 · 714 阅读 · 0 评论