![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
海马HiMark
这个作者很懒,什么都没留下…
展开
-
C++十大设计模式(易懂)
单例模式:单例模式:确保一个类只有一个实例,并且这个实例化向整个系统提供(例如只有一台打印机,可以有多个打印任务队列,但是只能有一个正在打印)。单例模式又分为(饿汉模式,懒汉模式)两种饿汉模式:程序运行即创建对象并实例化,静态实现所以线程是安全的懒汉模式:创建对象不实例化,需要的时候才实例化,线程不安全需要(加锁)工厂模式:建立对象的类就如一个加工厂,建立对象就如一个产品,使用产...原创 2018-12-18 20:33:24 · 11451 阅读 · 0 评论 -
快速排序-Quick
快速排序基本思想 快速排序是一种划分交换的方法,它采用分治法进行排序。1.先从数列中取出一个数作为基准数2.分区过程,将比基准值大的数全放到它的右边,小于或等于它的数全放到它的左边,基准值则在中间3.再对左右区间重复第二步,直到各区间只有一个元素或没有元素/////////////////////////快速排序//时间复杂度: 最坏O(n^2) 序列是完全逆序的//...原创 2018-07-30 16:31:56 · 193 阅读 · 0 评论 -
哈希表
哈希概念* 在一种数据结构中,在插入元素时,由待插入元素的值根据一个特殊函数计算出该元素的存储位置,并将该元素放置在此处。在搜索元素时,还是由搜索的元素值根据这个特殊函数计算存储位置,直接在该位置将元素取出即可。该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(散列表)。哈希冲突我们使用同一个哈希函数来计算不止一个的待存放的数据在...原创 2018-07-21 14:37:55 · 459 阅读 · 0 评论 -
删除堆顶元素 【堆】
在堆中删除堆顶元素删除元素之前先判断是否为空,如果未空则删除失败在删除堆顶元素之后必须还是一颗完全二叉树,因为堆是由数组进行存储的所以直接删除数组的最后一个元素,不能保证还是一颗完全二叉树因此将堆顶元素与堆尾元素交换,然后进行调整使其满足堆的约束条件 调整思想如下:从根节点开始调整比较根节点值与左右孩子节点的值,1如果根节点值为最大值则满足条件2如果右孩子存在且...原创 2018-07-16 10:07:33 · 4558 阅读 · 0 评论 -
双向链表的实现(带头带环)
C语言实现双向链表的基本功能 1.尾插2.尾删3.头插4.头删5.查找指定元素的位置6.在指定位置之前插入元素7.在指定位置之后插入元素8.删除指定位置的元素9.删除指定值的元素10.删除指定所有相同的元素11.求链表的长度12.判断链表是否为空头文件文件名dlinklist.h#pragma once //防止头文件重复定义...原创 2018-04-18 00:18:23 · 358 阅读 · 0 评论 -
在堆中插入元素 【堆】
堆的结构定义 5 typedef char HeapType; 6 7 #define MAXSIZE 100 8 //比较函数可以根据情况定义大小堆 9 typedef int (*compare)(HeapType a, HeapType b); 10 //如果是大堆 11 int Greater(HeapType a, HeapType b) 12 { 13 ...原创 2018-07-13 20:20:08 · 4034 阅读 · 0 评论 -
销毁一颗二叉树【数据结构】
销毁一颗二叉树 销毁树与遍历操作类似,即遍历一个节点释放 如果采用先序遍历或者中序遍历,销毁根节点后就找不到左右孩子在销毁的时候需要保存左右孩子的地址。因此采用后序遍历销毁一颗二叉树,按照左孩子,右孩子,根节点的顺序销毁, 注意:根节点将根节点指向空,防止成为野指针。340 void DestroyNode(TreeNode* node)341 {342 f...原创 2018-07-07 15:59:46 · 12990 阅读 · 0 评论 -
非递归实现二叉树的先序遍历,中序遍历,后序遍历
非递归实现二叉树的先序遍历,中序遍历,后序遍历1. 二叉树先序遍历(非递归)先序的遍历的访问顺序为先根节点,再左孩子,最后右孩子。所以,根据栈后进先出的特点,应先入栈右孩子,再入栈左孩子。先序遍历,借助栈实现1根节点入栈 2判断栈顶元素是否为空 3访问栈顶元素,出栈 4栈顶元素的右孩子若不为空,入栈。栈顶元素的左孩子不为空,入栈。 5循环2-4...原创 2018-07-13 16:39:25 · 1695 阅读 · 0 评论 -
数据结构:【二叉树】 先序,中序,后序,层序,递归实现!
* 二叉树的基本操作*递归实现先序 中序 后序 层序遍历 二叉树特点 : 每个节点最多有两个子树,二叉树不存在度大于2的节点 二叉树的子树有左右之分,其子树的次序不能颠倒二叉树的存储 A 顺式存储优点: 存储完全二叉树,简单省空间。缺点: 存储一般二叉树尤其单支树,存储空间利用不高。 B 链式存储...原创 2018-05-12 09:26:34 · 362 阅读 · 0 评论 -
数据结构:【二叉树】高度,叶子结点个数,结点个数,等常规操作
求二叉树的高度 求二叉树叶子结点的个数 求二叉树结点的个数 求二叉树第K层节点的个数 判断一个节点是否在一棵二叉树中 获取一个节点的双亲节点 获取一个节点的左孩子节点 获取一个节点的右孩子节点二叉树高度(递归)int Bitreedeep(Bitree *tree){ if (tree == NULL) { //非法 ret...原创 2018-05-12 10:58:44 · 2068 阅读 · 0 评论 -
归并排序Merge
归并排序归并排序是一种基于分治法的一种排序方法。它将要排序的序列分成两个长度相等的子序列,为每一个子序列进行排序,然后再将子序列合并成一个有序的序列。 //归并排序//时间复杂度 O(N*logN)//空间复杂度 O(N)//稳定性:稳定排序///////////////////第一个区间[beg,mid)//第二个区间[mid,end)void _MergeArr(i...原创 2018-07-30 17:16:55 · 362 阅读 · 0 评论 -
交换排序——快排/冒泡
快速排序: 平均时间复杂度:O(NlogN) , 最坏时间复杂度: O(N^2) 不稳定 快速排序思想: 1、在待排序列中找一个基准值(默认选择最后一个元素) 2、然后将该基准值放置在合适的位置, 3、使得基准值之前的元素都小于等于基准值,基准值之后的元素都大于等于基准值。然后再对基准值之前的序列使用上述方法进行排序寻找基准值的位置 对基准值之后的序列也使用上述方法,进行排序寻找...原创 2018-09-16 17:18:36 · 173 阅读 · 0 评论 -
设计模式-工厂模式(简单,工厂方法,抽象)
工厂模式建立对象的类就是一个工厂,被建立的对象就是一个产品,在工厂中加工产品,不用在乎产品如何产生。降低模块耦合。工厂模式分类包括 简单工厂模式,工厂方法模式,抽象工厂模式。1简单工厂模式由工厂对象决定创建哪一个产品类的实例,这些产品类(继承自父类或接口)。例如:一个工厂生产A,B两种产品,当客户需要那种产品就告诉工厂。缺点:当新增加一种产品的时候,就要去修改工厂的类//实现方法:...原创 2018-12-18 20:05:55 · 183 阅读 · 0 评论 -
面试总结:B树,B+树的原理及区别
之前在网上看到过一些B树与B+树的区别然后主要是针对定义来陈述,分分钟看的我快要冬眠,然后在一次面试遇到该没问题没回答上来一首凉凉送 给自己,今天老老实实的分享自己对B树,B+树浅显理解,若望指出不足。B树的原理动态查找树主要包括:二叉搜索树,平衡二叉树,红黑树,B树,B-树时间复杂度O(log2N),通过对树高度的降低可以提升查找效率尤其是在大量数据进行存储的时候会存储到外部 磁盘,通过对...原创 2018-12-08 18:58:32 · 27506 阅读 · 2 评论 -
二叉搜索树的创建,插入,查找过程实现
基于顺序查找数据随机:顺序查找,遍历 时间复杂度O(N)数据已序:二分查找,时间复杂度O(log2^N)索引顺序:数据量大,建立静态索引基于树形查找二叉树: 二叉搜索树,二叉平衡树多叉树: B-树,B+树,B*树基于哈希查找哈希:哈希表,哈希桶,位图,布隆过滤器,二叉搜索树(二叉排序树)特点:左子树不为空,则左子树上所有节点小于根节点的值右子树不为空,则右子树上所有节...原创 2018-11-17 18:07:43 · 13645 阅读 · 0 评论 -
深入理解红黑树与B+树应用场景
红黑树和B树应用场景有何不同?2者都是有序数据结构,可用作数据容器。红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树。B树多用在内存里放不下,大部分数据存储在外存上时。因为B树层数少,因此可以确保每次操作,读取磁盘的次数尽可能的少。在数据较小,可以完全放到内存中时,红黑树的时间复杂度比B树低。反之,数据量较大,外存中占主要部分时,B树因其读磁盘次数少,而具...原创 2018-09-29 07:19:41 · 19355 阅读 · 4 评论 -
二叉树先序,中序,后序,层序遍历非递归
#include<iostream>#include<stack>using namespace std;//==========================先序遍历void preorderR(Node* root) //先序遍历 V L R{ Node* cur = root; stack&原创 2018-10-12 16:43:45 · 635 阅读 · 0 评论 -
归并排序--排序算法
//归并排序(分治思想)//按照快速排序递归地将待排区间依次划分为两个区间,区间只剩一个数的时候停止,//如果一个区间只有一个数,可以看作是有序区间,然后对左右两个小区间进行归并,归并后依然保持有序//依次将左右两个有序的子区间归并为一个大的有序区间,并返回给上一次递归//直到划分的所有小区间归并为一个有序序列,归并排序完成//时间复杂度O(NlogN) 空间复杂度O(N) ...原创 2018-09-26 20:15:39 · 147 阅读 · 0 评论 -
快速排序
//快速排序思想//选取一个基准值一般选取右值,从前往后遍历找到一个小于基准值的值然后停下来,从后往前找一个大于基准值的值然后停下来//交换left,right此时,继续向后,向前遍历,直到找到left=right的时候,那么就第一次遍历完成,然后交换基准值与left=right的值//此时的结果是划分为了两个区间,继续按照上述方法排序,直到每一个小区间只剩下一个值的时候就排序完成。//时...原创 2018-09-26 17:27:45 · 145 阅读 · 0 评论 -
位图
位图的概念 在一个结构中,用一个比特位来描述一个数据的状态,这种结构就称为位图。位图实际上是哈希表的一种变形。1. 位图的结构定义首先,该位图中最大能表示的比特位个数需要提前设定。 然后,根据最大比特位数来进行内存的申请。内存不能以比特位为单位进行申请,所以可以自己选用一种数据类型来申请内存,这里以64位8字节为一个数组元素长度进行内存的申请。#pragma once#inclu...原创 2018-07-24 15:34:51 · 163 阅读 · 0 评论 -
在无头单链表的一个节点前插入一个节点(不能遍历)
例如 无头链表 A—>B—>C—>D 在节点C前面插入一个节点思路: 乾坤大挪移 在C的后插入一个节点,可以将C后面新插入的节点Q的值与C的值交换 即可实现C节点之前插入节点的功能void Listentry(ListNode** phead, LinkNode* pos ,Datatype value){ if(pos==NULL...原创 2018-06-05 20:58:51 · 2219 阅读 · 0 评论 -
删除一个无头单链表的非尾节点(不能遍历)
例如 无头链表 A —> B —>C —->D —–>E无法获得A节点位置, 删除C节点思路: 狸猫换太子 C-->data=D->data; C-->next=D->next; destroy(D);void ListsomeDel(ListN...原创 2018-06-05 20:34:27 · 479 阅读 · 0 评论 -
从尾到头打印单链表 递归及非递归实现
思路一:数组法 构建一个Datatype类型的数组,将单链表所有的数据保存下来, 再将数组倒序输出就可以。缺点:相对于较长单链表不适合,对于较短单链表浪费资源void printlist(LinkNode* head){ Datatype arr[100] ; int i=0; while(head!=NULL) { ...原创 2018-06-05 20:16:37 · 1839 阅读 · 0 评论 -
栈的入栈出栈取栈顶(链表实现)
基于链表实现入栈,出栈,取栈顶元素的操作 链式栈 入栈 (链表头插) 比较方便 出栈 (链表头删)头文件#pragma once //防止头文件重复定义#include<stdio.h>#include<stdlib.h>t...原创 2018-04-19 11:06:09 · 7058 阅读 · 1 评论 -
单链表的实现 基础版
以下为单链表(不带头节点,不带环)的C语言实现代码 注:更多功能的实现请查看 单链表(进击版)实现功能(基础版)//初始化链表头节点//链表尾插//链表头插//链表尾删//链表头删//查找元素在链表中的地址//查找元素在链表中的下标头文件代码link.h#pragma once //防止头文件重复包含#include <stdi...原创 2018-04-08 02:19:16 · 214 阅读 · 0 评论 -
单链表的实现 进阶版
以下为单链表(不带头节点,不带环)的C语言实现代码 注:建议结合单链表(基础版)一起来看,因为进击版中的一些功能的实现调用了基础版的一些函数(已标出)可以简化功能实现的代码量。//在pos前插入元素,不遍历整个链表 //在pos后插入元素 //删除指定位置元素 //删除指定的元素 //删除指定所有元素 //判断链表是否为空 //求链表长度 //逆序打印单链表头文件link.h#pra原创 2018-04-08 02:42:40 · 211 阅读 · 0 评论 -
顺序表的实现插入删除
实现基于静态数组的顺序表的以下基本操作: 1. 初始化 2. 尾插 3. 尾删 4. 头插 5. 头删 6. 读任意位置元素 7. 修改任意位置元素 8. 查找指定元素值的下标 9. 在任意位置插入元素 10.删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 11.删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本 12原创 2018-03-28 15:43:47 · 4869 阅读 · 0 评论 -
单链表实现约瑟夫环
约瑟夫环以五个节点的带环单链表(最后一个节点指向第一个节点)为例子 1 从链表头开始,先删除第二个节点 2 从删除节点的下一个节点开始,再往后找第二个节点,然后删除。 3 一直重复过程2,直到剩下一个节点,返回该节点。ListNode* JoeCircle(ListNode** phead, int m){ if (phead == NULL) ...原创 2018-06-05 21:41:41 · 598 阅读 · 0 评论 -
冒泡排序 - 基本实现
冒泡排序 排序分为升序和降序,本文采用回调函数传入 具体实现时可选择相应的排序。时间复杂度 O(n^2) 空间复杂度 O(1)稳定性:比较稳定排序规则以回调函数方式引入://排序规则typedef int(*Compare)(int a, int b)升序排序规则定义如下://升序排序规则int Greater(int a, int ...原创 2018-06-29 15:48:05 · 164 阅读 · 0 评论 -
克隆一棵树 【数据结构】
克隆一棵树 树的创建是递归的,那么树的克隆也采用递归的方式 如下为先序遍历的方法克隆一棵树1 根据树的根节点创建新的根节点 2 根据已知树的左子树递归创建新的左子树 3 根据已知树的右子树递归创建新的右子树 4子树的创建过程按照2~3步骤进行 5如果子树为空直接返回,跳出递归函数。103 //克隆一棵树104 TreeNode* TreeClone(TreeNode* r...原创 2018-07-06 16:11:39 · 2269 阅读 · 0 评论 -
根据先序遍历的结果创建一棵树【D.S】
根据先序遍历的结果创建一棵树根据先序遍历的结果还原一棵树 则该树是不确定的 例如 先序遍历的结果ABC 有两种形式 如果要还原一棵树,除了要知道先序遍历的结果,还需要知道树的位置。如果用#表示空树, 则左边的二叉树为 AB##C## 而右边的二叉树为 ABC#### 已只先序遍历的结果,...原创 2018-07-06 11:58:22 · 2600 阅读 · 0 评论 -
二叉树的先序,中序,后序,层序遍历(递归版)
二叉树的概念 一颗二叉树是结点的一个有限集合,集合或者为空或者是由一个根结点 加上两颗分别称为左子树和右子树的二叉树组成二叉树的特点 二叉树的左右顺序不能颠倒 每个结点最多由两颗子树,二叉树的结点度数不大于2二叉树的组成 二叉树的表示方法 // 常用左右孩子表示法 3 typedef char Treetype;...原创 2018-07-06 10:28:11 · 873 阅读 · 0 评论 -
哈希桶
哈希表的开散列 开散列法又叫链地址法 开散列法:首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一个集合,每一个子集称为一个桶,个桶中元素通过单链表链接起来,各链表的头节点存储在哈希表中。bucket.h 1 #pragma once 2 3 #include<stdio.h> 4 #include<stdlib.h> ...原创 2018-07-24 08:28:58 · 4306 阅读 · 1 评论 -
二叉搜索树的插入查找删除
二叉搜索树 二叉搜索树又称为二叉排序树,它或者是一棵空树,或者具有以下性质 它的左子树不为空,则左子树上所有节点值都小于根节点的值 它的右子树不为空,则右子树上所有节点值都大于根节点的值 它的左右子树也分别为二叉搜索树 #include<stdio.h>//定义搜索二叉树的节点结构/孩子表示法ty...原创 2018-07-24 08:16:29 · 249 阅读 · 0 评论 -
搜索二叉树的查找,插入,删除递归实现
搜索二叉树的概念 搜索二叉树满足下面两个要求:(1)它是一棵二叉树(2)该二叉树中,任意一棵树的根节点值大于它左子树中的所有结点的值,小于右子树中的所有结点的值 因此对于搜索二叉树的中序遍历来说,它是按由小到大依次递增的顺序排列的。1. 搜索二叉树的表示 3 //定义搜索二叉树的节点结构/孩子表示法 4 typedef char SearchTre...原创 2018-07-18 11:07:58 · 4630 阅读 · 1 评论 -
迷宫求解 调用栈,及递归实现
迷宫求解 1. 首先要有一张迷宫地图,地图由两部分组成:(1)一是迷宫中各处的位置坐标,(2)二是迷宫各位置处的状态信息,即该处是墙还是路1)迷宫地图是6*6的,即二维数组是6行6列的。(2)在迷宫中用0表示墙,用1表示路 给定一个地图 初始化地图 3 #define ROW 6 4 #define COL 6 5 6 //定义一个仓库存储地图和...原创 2018-07-17 11:42:37 · 745 阅读 · 0 评论 -
销毁堆,清理堆,统计堆节点个数【堆】
销毁堆,清理堆,统计堆节点个数1销毁堆 销毁堆时,不仅要将堆中所有元素清空,还需将表示大小堆的函数指针置空。211 //销毁堆212 int HeapDestroy(Heap* heap)213 {214 if(heap==NULL)215 {216 //已经销毁217 return 0 ;218 }219 ...原创 2018-07-16 10:42:50 · 710 阅读 · 0 评论 -
根据一个堆对数组元素进行排序 【堆】
借用堆对一个数组进行排序首先创建一个堆,如果是升序创建(大堆)反之则相反 大堆创建后初始化,将数组元素插入到堆中来构成堆 对堆中的堆顶元素进行删除 第一次删除过后,最大的堆顶元素存在堆的数组的最后一个位置 第二次删除后,次大的堆顶元素存放在堆的数组的倒数第二个位置 ....待堆中的所有元素删除完之后,存放堆的数组元素排好由小到大最后将存放堆的数组元素依次赋值...原创 2018-07-16 10:30:52 · 1681 阅读 · 0 评论 -
【推荐】数据结构 【栈】:顺序表的实现
数据结构栈的顺序表实现基本功能 1入栈2出栈3取栈顶元素思想介绍: **栈 即先进后出 顺序表实现采用 入栈 :尾插 出栈 :尾删**头文件文件名 seqstack.h#pragma once //防止头文件重复定义#include<stdio.h>#inc...原创 2018-04-18 17:25:52 · 401 阅读 · 0 评论