![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 66
头晕神教的神秘人
这个作者很懒,什么都没留下…
展开
-
DFS、BFS经典例题
文章目录深度优先搜索1.n张牌分别放进n个盒子,有几种方案2.leetcode 690 员工重要性3.leetcode 733 图像渲染4.leetcode 130 被围绕的区域5.leetcode 200 岛屿数量广度优先搜搜索1.走迷宫问题2.员工重要性3.N叉树的层序遍历深度优先搜索1.n张牌分别放进n个盒子,有几种方案思路:代码流程:DFS(){处理边界,向上回退尝试当前的每一种可能确定一种可能后,递归处理下一步----DFS(下一步)回收本次处理结果}#include原创 2021-09-13 19:48:03 · 490 阅读 · 0 评论 -
[排序算法] 常见排序算法原理及代码实现
文章目录插入排序----直接插入排序插入排序----希尔排序选择排序---最简单的选择排序各排序算法对比插入排序----直接插入排序思路:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。// 直接插入排序void InsertSort(int* a, int n){ for (int i = 0; i < n - 1; i++) { //将tmp插入到[0,end]这个有序序列 int end = i;原创 2021-08-18 14:40:07 · 229 阅读 · 0 评论 -
[C++] STL之空间配置器
文章目录什么是空间配置器?为什么需要空间配置器一级空间配置器二级空间配置器内存池工作原理内存碎片问题什么是空间配置器?空间配置器,就是用来为各个容器高效的管理空间(空间的申请与回收)的为什么需要空间配置器在模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:空间申请与释放需要用户自己管理,容易造成内存泄漏频繁向系统申请小块内存,容易造成内存碎片频繁向系统申请小块内存,影响程序运行效率原创 2021-06-06 18:52:53 · 260 阅读 · 0 评论 -
[C++] 哈希表(散列表)详解
文章目录概述插入元素搜索元素哈希函数常见的哈希函数哈希冲突闭散列线性探测闭散列增容闭散列--线性探测代码:★开散列开散列的增容哈希表的迭代器实现:开散列代码:概述哈希表又称散列表,是根据关键码值(Key,value)直接进行访问的数据结构。哈希结构中存在一种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,以便于在查找时通过该函数可以很快找到该元素。这种函数称为哈希函数。插入元素根据插入元素的关键码值,用哈希函数计算出插入位置进行存放。搜索元素用哈希函数计算出该元素的存储位置,然后在原创 2021-05-27 10:32:42 · 1382 阅读 · 3 评论 -
[C++] 红黑树详解
文章目录红黑树红黑树和AVL树对比红黑树的结构红黑树的插入情况一情况二情况三红黑树红黑树,一种特殊的二叉搜索树, 为每个结点描述了颜色(红色或黑色),通过对所有结点的着色方式限制,红黑树确保了没有一条路径会比其他路径的长度超出两倍,因而是近似平衡的。红黑树的性质:红黑树通过以下性质来实现近似平衡结构:根节点是黑色的 ;每个结点不是红色就是黑色;如果一个节点是红色的,则它的两个孩子结点是黑色的 ; (红色结点不能连续出现)对于任意结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数原创 2021-05-22 13:13:39 · 2443 阅读 · 13 评论 -
[数据结构]二叉搜索树 / 二叉排序树
概述二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:① 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值② 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值③ 它的左右子树也分别为二叉搜索树例如:实现结点定义template <class T> //泛型struct BNode { T data_; typedef BNode<T> Node; //别名 Node* left; Node* right; BN原创 2021-05-02 22:38:41 · 270 阅读 · 0 评论 -
[剑指offer]jz. 28 数组中出现次数超过一半的数字 哈希结构+摩尔投票算法
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法一:1、定义一个数组num[ ]存放数组中的数字出现的次数2、遍历数组,每遇到一个数字,假设为i,就将num[ ]中的第i项的值+13、判断并返回num[ ]中出现次数大于数组长度一半的数字(注意:此处应该返回的是项数i的值)时间复杂度为O(n)//数组中出现次数超过一半的数原创 2021-04-21 15:50:17 · 145 阅读 · 1 评论 -
[数据结构]堆排序的向上调整算法
向上调整算法的作用就是通过从下到上的算法排序,将任意一个堆变成最小堆或者最大堆。注意:此处向上调整算法为从下到上,所以执行时需要传入参数来确定具体从哪一个结点开始排序;不同于向下调整算法总是从根节点开始排序。步骤:1、确定待排序结点2、与父结点进行比较,满足条件则交换3、更新结点位置,继续执行第二步4、遍历完后退出循环,此时这个堆已经有序(具体为实现最大堆还是最小堆可以设定判断条件中的’<‘或者’>'来控制)void shiftUp(int child) { int pare原创 2021-04-19 10:49:05 · 582 阅读 · 0 评论 -
[算法]动态规划
文章目录概述例题1:求斐波那契数列第n项的值常规做法:**递归**动态规划做法:例题2:青蛙跳台阶问题概述 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。原创 2021-04-10 14:13:35 · 552 阅读 · 0 评论 -
[数据结构]二叉树的性质
二叉树的性质若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h- 1.对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=Log2(n+1). (ps:Log2(n+1)是log以2为底,n+1为对数)对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号原创 2021-03-05 15:10:35 · 245 阅读 · 0 评论 -
[数据结构] 构建二叉树并实现相关功能
完整代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>typedef char datatype;//二叉树的结点 二叉链typedef struct BinaryTreeNode{ struct Node* left; struct Node* right; datatype data;}Node;ty原创 2021-01-10 12:18:54 · 318 阅读 · 0 评论 -
[数据结构]关于树的练习题(2)
前十道题目:[数据结构]关于树的练习题(1)11.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1,中序遍历序列为4 7 5 6 9 1 2,则其后序遍历序列为( )A.4 2 5 7 6 9 1B.4 2 7 5 6 9 1C.4 7 6 1 2 9 5D.4 7 2 9 5 6 1答案:C解析:此题类似于上面的OJ题的解题思路,通过前序遍历找到子树的根,根据根元素在中序遍历的位置找到子树的左右区间。故:根为: 55的左子树:4 7 5的右子树: 6 9 1 25的左原创 2021-01-10 12:15:07 · 1553 阅读 · 0 评论 -
[数据结构]关于树的练习题(1)
1.下列关于树的叙述正确的是( )A.树中可以有环B.树的度是指所有结点中度最小的结点的度C.树的深度指的是结点数最多的那一层的深度D.树的根结点是所有结点的祖先结点答案:D解析:A: 树中的节点不能相交B: 树的度为所有节点中最大节点的度C: 树的深度为根节点到叶子节点的最大深度2.2-3树是一种特殊的树,它满足两个条件:(1) 每个内部结点有两个或三个子结点(2) 所有的叶结点到根的距离相同如果一颗2-3树有10个结点,那么它有( )个叶结点。A.7B.8C.7 或原创 2021-01-10 11:26:25 · 5066 阅读 · 0 评论 -
【数据结构】堆排序的向下调整算法
算法解析要明白向下调整算法首先要掌握数据结构中堆的定义(不是内存中的堆)。1·概念:堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。2·堆的分类:最大堆:每个父节点的值都大于孩子节点。最小堆:每个父节点的值都小于孩子节点向下调整算法的作用就是通过从上到下的算法排序,将任意一个堆变成最小堆或者最大堆。步骤:(此处以最小堆为例)1、从根节点的左右孩子中选取一个较小值min2、当前需要调整的数据与较小值min进行比较①、大于min:和min进行交换,从交换后的位置继续执行第1步;②原创 2021-01-03 19:14:24 · 852 阅读 · 0 评论 -
leetcode算法题-用栈实现队列
题目要求出队操作假设有四个有效元素1,2,3,4依次存入,出栈顺序:4,3,2,1.出队顺序:1,2,3,4.此时出栈操作只能出栈的最后一个元素4,而出队操作出的是队列的第一个元素1,此时我们可以再定义一个副栈,将前3个元素出栈再入栈到副栈中,再对主栈进行出栈操作,就实现了1的出栈,封装后可视为出队操作,图解:leetcode题目链接:用栈实现队列完整代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include原创 2020-12-30 16:30:56 · 286 阅读 · 0 评论 -
leetcode算法题-用队列实现栈
题目要求:用队列实现出栈出队的原则:先进先出。 出栈的原则:后进先出。例如:有四个元素1,2,3,4依次入队,其出队顺序为:1,2,3,4。若1,2,3,4依次入栈,其出栈顺序为4,3,2,1。也就是说出栈操作去除的是当前队列的最后一个元素4,那我们只需要将前3个元素出队再入队,此时4为队首元素,再将其进行出队即可。下面看图解:剩余的获取栈顶元素,销毁栈等操作比较简单在此不多赘述,附上用队列实现栈–leetcode链接以及完整代码:#define _CRT_SECURE_NO_WA原创 2020-12-30 16:08:07 · 348 阅读 · 0 评论 -
顺序表的相关操作 头插,尾插,头删,尾删,任意位置插入删除
顺序表的相关操作 头插,尾插,头删,尾删,任意位置插入删除#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>#include<stdlib.h>typedef int slDatatype;//顺序表内的数据类型(便于维护)//动态顺序表typedef struct seqList { slDatatype *data; //数组指针 int size;原创 2020-12-08 17:00:25 · 2352 阅读 · 3 评论 -
【算法题】反转链表的两种方法
反转单链表的两种办法方法一:首先,创建一个与五个元素的单链表,定义三个指针,cur和next分别指向头结点和它的下一个结点,newhead指针来存储新的头结点(newhead初始值为NULL)。如图:第二步,将cur->next指向newhead,再将cur的值赋给newhead,然后cur和next向后移动,此时cur指向数字2,next指向3,如下图:(这一步操作断开了1和2之间的联系,1成为了新的头结点,重复执行此步骤,类似于单链表的头插)后面的循环步骤用图片演示:最后一原创 2020-12-16 10:48:50 · 443 阅读 · 0 评论 -
用带头尾指针的单链表实现队列的相关操作
前言: 在观读本篇博客之前请先阅读我之前的一篇博客顺序表的相关操作. 其中的内容可以帮你更好的理解本篇博客。目录队列的实现初始化----创建新结点入队-尾插出队-头删获取队首/队尾元素判断队列是否为空完整代码展示队列的实现我这里使用带头尾指针的单链表来模拟队列的功能,采用这种方法较为方便,其入队出队操作可以分别使用单链表的尾插,头删(或者头插,尾删)来实现。先看结点和队列的结构体定义:typedef int Qdatatype;//结点typedef struct Qnode { Q原创 2020-12-28 13:36:16 · 2286 阅读 · 0 评论