数据结构
文章平均质量分 50
强大的RGG
五道口混子研究生,干饭大队队长!
专注于高性能C++编程,略懂机器学习和语音增强算法。知乎同名。
展开
-
02 用单调队列解决滑动窗口问题
用单调队列解决滑动窗口问题原创 2023-07-17 15:32:25 · 334 阅读 · 0 评论 -
位运算符的优先级,如何判断一个数是否是2的幂,以及求不大于这个数的最大2的幂
如果 n & (n-1) 的值为0 则是 2的幂。原创 2022-09-22 21:40:22 · 126 阅读 · 0 评论 -
实现一个线程安全的双向链表(C++)
最近实现了一个线程安全的双向链表,使用的是C++类的模式写的,和以前学习数据结构使用struct结构体实现的方式不同,对函数进行了封装,以及使用了C++中的类模板,还有unique_lock锁,对内存泄漏也进行了优化。以下是代码:(注意:请勿在业务代码中使用,代码未经过完全的测试)原创 2022-10-23 15:47:22 · 1883 阅读 · 0 评论 -
递归方法(判断二叉树是否是对称二叉树)
递归的函数要干什么?函数的作用是判断传入的两个树是否镜像。输入:TreeNode left, TreeNode right输出:是:true,不是:false递归停止的条件是什么?左节点和右节点都为空 -> 倒底了都长得一样 ->true左节点为空的时候右节点不为空,或反之 -> 长得不一样-> false左右节点值不相等 -> 长得不一样 -> false从某层到下一层的关系是什么?要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左原创 2021-09-17 20:52:11 · 176 阅读 · 0 评论 -
判断二叉树是否是平衡二叉树(C++)
第一种方法:采用自底向上的递归方法int height( TreeNode* root){ if(root == NULL){ return 0; }else{ int leftheight = height(root->left); int rightheight = height(root->right); if(leftheight == -1 || rig.原创 2021-09-17 16:07:45 · 322 阅读 · 0 评论 -
王道中数据结构的排序算法
插入排序:1.1. 希尔排序:void ShellSort(ElemType A[],int n) { int i,j,dk; for (dk = n / 2; dk >= 1; dk = dk / 2) for (i = dk + 1; i <= n; ++i) if (A[i]<A[i-dk]) { A[0] = A[i]; for (j = i - dk; j > 0 && A[0] < A[j]; j -= d.原创 2021-08-25 11:41:45 · 274 阅读 · 0 评论 -
用栈实现一维消消乐(c语言写法)
用栈实现一维消消乐(c语言写法)题目:输入一串字符,消去两个相邻的字符对。思路:利用栈先进后出的特点,先写好栈的各个函数如初始化栈,进栈,出栈,读栈顶元素。在每次入栈之前,将当前元素与栈顶元素进行比较,如果相同则消除,不同则入栈,直到输入结束。然后用第二个栈对输出顺序进行逆序,使输出满足要求。代码:#include <stdio.h>#define maxsize 30#define elemtype char#define bool int#define false 0#原创 2021-06-19 15:29:09 · 481 阅读 · 0 评论 -
非递归算法和递归算法求二叉树的高度(C语言)
算法思想: 采用层次遍历的算法思想,设置变量level 来记录当前结点所在的层数,设置last指向当前层数的最右结点,每次层次遍历出队时与last指针比较,相等则层数加一,并让last指向下一层的最右结点。每处理到这一层的最后一个结点时,他的下一层的结点也全部入队了,这时就使last = rear 即可标识下一层最右结点的位置算法实现:非递归算法:int Btdepth(BiTree T){ if(!T){ return 0; //如果树为空则返回0 }原创 2020-10-24 20:32:20 · 858 阅读 · 2 评论 -
已知二叉树按顺序存储结构进行存储,设计一个算法,求编号i和j的公共祖先
算法思想: 任意两个结点必存在最近的公共祖先,最坏的情况是根结点。算法实现:Elemtype Comm_Ancestor(SqTree T, int i , int j){ if(T[i]!='#' && T[j] != '#'){ while(i != j){ if(i > j){ i = i/2; } if(j>i){原创 2020-10-20 20:57:24 · 2681 阅读 · 2 评论 -
整数反转(C实现)
题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-integer著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。解题:解体思路:利用判断回文数的方法进行整数的翻转,这个题主要是考的是int型的溢出问题。原创 2020-09-29 10:58:06 · 380 阅读 · 0 评论 -
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
bool isPalindrome(int x){ long res = 0; int tmp = x; if(x<0) return false; while (x!=0){ res = res *10 + x % 10; x /= 10; } if(res == tmp){ return true; } else{ return false; }原创 2020-09-27 17:53:01 · 430 阅读 · 0 评论 -
交换排序(冒泡排序,快速排序)知识点总结
冒泡排序:思想:从后往前(或者从前往后)两两比较相邻元素的值,若为逆序,则交换他们的位置。空间复杂度:O( 1)时间效率:最好情况:比较次数为 n-1 ,移动次数为 0,时间复杂度为O(n). 最坏情况:逆序时情况最坏,比较次数为 n(n-1)/2*,移动次数为:3n(n-1)/2* ,平均时间复杂度和最坏时间复杂度相等为O(n^2)稳定的快速排序思想:任取一个元素为pivot作为枢纽(通常取首元素),通过一趟排序把它分为两部分,一边小于pivot,一边大于pivot。则pivot就原创 2020-09-03 18:47:08 · 158 阅读 · 0 评论 -
直接插入排序,折半插入排序,希尔排序的C语言实现
#include<stdio.h>#define Elemtype intvoid Printf(Elemtype A[],int n){ int t; for(t = 1;t<n;t++ ){ printf("%d ,",A[t]); }}/************直接插入排序*************/void InsertSort(Elemtype A[],int n){ int i , j; for(i=2;i&原创 2020-09-01 16:47:16 · 435 阅读 · 0 评论 -
直接插入排序,折半插入排序,和希尔排序之间的对比
1, 直接插入排序:空间复杂度:O(1)时间复杂度:最好:O( n)最差:O( n^2)最坏情况下的比较次数: i=2 到 i=n ,i求和移动次数为:i=2 到 i = n (i+1)求和是一个稳定的算法,适用于顺序存储和链式存储。2, 折半插入排序:时间复杂度:O(n^2);比较次数为 :O(n logn); 与待排序表的初始状态无关,仅取决于表中的元素个数n,而元素的移动次数并未改变,它依赖于排序表的初始状态。 只适用于顺序存储。是一种稳定的排序算法3, 希尔排序原创 2020-09-01 16:33:07 · 3281 阅读 · 0 评论 -
散列表的知识点总结
1, 散列函数:Hash(key) = addr2, 冲突:略, 同义词:略3, 散列表:建立了关键字和存储地址之间的一种直接对应关系4, 散列函数的构造方法:直接定址法:取关键字的某个线性数值为散列地址除留取余法:H(key) = key%p **p的选取方法:取一个不大于m,但最接近m的质数 **数字分析法:选取数码分布较为均匀的若干位为散列地址平方取中法:取关键字的平方值的中间的几位为散列地址5, 处理冲突的方法:开放定址法:Hi = (H(key) + di )原创 2020-08-26 18:13:08 · 396 阅读 · 0 评论 -
图的应用(二)
1, 有向无环图:若一个有向图中不存在环,则称为有向无环图,简称DAG图。(Directed Acyclic Graph)2, 拓扑排序:只有DAG图才有拓扑排序,每个顶点出现且仅出现一次,若A在B之前,则图中不存在B指向A的路径。时间复杂度为O( V+E ) 。3, 用DAG图表示一个工程,用顶点表示活动,则称为顶点表示活动的网络,记为 AOV网(Activity on Vertex Network)。4, ** 当网中不存在无前驱的节点时,说明这个图中必然含有环。5, 对于一般的图来说,其邻接原创 2020-08-16 11:41:24 · 1508 阅读 · 4 评论 -
关于图的应用的4个算法的知识点总结(一)
1,生成树:包含图的所有顶点只含尽可能少的边若砍去他的一条边则变为非连通若增加一条边,则会形成一个回路2,最小生成树:对于带权连通图,权值之和最小的那棵生成树就是最小生成树3,最小生成树的性质:不是唯一的,但是当图中的所有的边的权值不相等时,最小生成树时唯一的。最小生成树的权值之和总是唯一的4 Prim算法:初始时从图中任取一个顶点,加入树T中,再选择一个与当前T中顶点集合距离最近的顶点,并将这个点和它的这个边加入到树T中,每次操作后T中的顶点数和边数都加一,直到所有的顶点都在数T中结束。*原创 2020-08-16 10:53:42 · 672 阅读 · 0 评论 -
关于二叉树应用的知识点总结
1,ASL(平均查查找长度):按层来算,每一层的结点个数*这一层结点的路径长度。2,AVL(平衡二叉树):任何一个结点的平衡因子都不大于13,四种旋转:LL ,RR, LR,RL****4,深度为h的平衡二叉树中含有的最少的结点数nh是:n0 = 0;n1=1;n2=2;…nh=n(h-1)+n(h-2)+15,树的带权路径长度(WPL)= 所有的叶结点带权路径长度 之和6,叶结点的带权路径 长度= 结点的权值 * 它的路径长度**7,**哈夫曼树的三点特性:1,每个初始结点最后都原创 2020-08-08 18:32:48 · 416 阅读 · 0 评论 -
二叉树的层次遍历(利用队列)
二叉树的层次遍历需要利用的队列的知识,按层入队。下面是代码。原创 2020-08-06 18:41:59 · 918 阅读 · 0 评论 -
二叉树的三种遍历(C语言版和C++版)
二叉树的递归遍历我想这个对大家应该不难,所以大家就直接看我的代码吧,我主要还是给大家讲讲非递归代码的实现。(代码在最后)大家只要把代码敲一遍,不管是递归还是非递归应该都能理解。二叉树的非递归遍历中序遍历:1,沿着根结点,向左依次入栈,直到左孩子为空2,栈顶元素出栈并访问,若有孩子为空,继续执行。3,若右孩子不为空,则将有孩子转执行1。先序遍历:与中序遍历是一样的,只是把访问操作放到入栈之前后序遍历:(这个是最特殊的了):1,沿根的左孩子依次入栈,直到左孩子为空。2,读栈顶元素,如果栈顶元素原创 2020-08-05 21:32:30 · 1612 阅读 · 0 评论 -
一个深度为L的满k叉树的性质
1,各层结点的数目是多少?k^(n-1)2,编号为n的结点的双亲结点(若存在)的编号是多少?(n-2+k) / k 取下界3,编号为n的结点的第i个孩子结点(n-1)k +1 +i4,编号为n的结点有右兄弟的条件是?其右兄弟的编号是多少?对于任意结点p ,他的最右边的孩子结点为 pk+1所以条件是(n-1)%k 不等于 0右兄弟编号为:n+1...原创 2020-07-30 17:38:57 · 3892 阅读 · 1 评论 -
二叉树的一些常考题型和注意的点
1,二叉树的前序,中序,后序序列中,所有的叶子结点的先后顺序:完全相同2,先序和中序,或者后序和中序,能唯一确定一棵二叉树3,线序和中序之间的关系:相当于以先序序列为入栈顺序,以中序序列为出栈次序这主要是为了做(知道前序序列,判断哪一个可能是他的中序序列)4,给定前序序列 (或者后序序列)和中序序列,求二叉树的另一个序列:每次按照前序(或者后序)找出根结点,然后按照中序把他两边的分为他的左右部分,然后再按照前序(或者后序)来确定他左右部分的根结点,以此循环,知道全部确定。5,引入线索二叉树的目的是原创 2020-07-30 09:42:52 · 561 阅读 · 0 评论 -
二叉树的性质,特性,和重要的题型总结和解法
二叉树基本是数据结构这门课里面最重要的一种树了,理解了二叉树,基本所有树的特性都掌握了。一,二叉树需要注意的点1,二叉树的子树有左右之分,不能随意换2,二叉树与度为二的树的区别(这一点是重点)1)度为二的树至少有三个结点2)二叉树的孩子结点不论有几个,只要有,他的位置就是确定的,即二叉树的孩子节点不是相对于另一个结点而确定的。二,几个特殊的二叉树1,满二叉树:高度为h,含有***(2^h-1)***个结点的树2,完全二叉树(这个是重点):每个结点都与满二叉树中的编号一一对应。3,二叉排序树原创 2020-07-18 09:16:23 · 206 阅读 · 0 评论 -
树的4条性质性质总结 和 公式的推导
树的性质总结(设树的 高度为h,度为m,结点数为n)特别是第三,四点做题经常用到1,树中所有的结点数n = 所有结点的度之和 + 1(+1的原因是得加上根结点)2,度为m的树的第i层上最多有 m^(i-1)个(i>=1)3, 高度为h的m叉树最多有(m^h + 1)/(m-1)个结点这个推导用的是等比数列求和4,具有n个结点的m叉树的最小高度是:log( n(m-1) + 1)以m为底;...原创 2020-07-16 15:01:49 · 1059 阅读 · 0 评论 -
用C语言实现带头结点的链队列
直接看代码,我在代码里面写了注释#include<stdio.h>#include <stdlib.h>#define elemtype int#define null 0/*****1,将队列的定义与链表的定义相区别 2,队列LinkQueue就是带头指针和尾指针的单 链表*****/typedef struct{ elemtype data; struct LinkNode *next;}LinkNode;typedef原创 2020-07-15 11:52:06 · 472 阅读 · 0 评论 -
用C语言实现队列的顺序存储结构
队列的顺序存储结构算是数据结构里面比较简单的一块知识点了,他的代码也很简单代码如下:#include<stdio.h>#define elemtype int#define maxsize 30#define false 0#define true 1#define bool char//循环队列typedef struct { elemtype data[maxsize]; int front ,rear;}SqQueue;void initQueu原创 2020-07-07 14:57:11 · 478 阅读 · 0 评论 -
用 C 实现顺序栈
tips:访问结构体内部时,如果是指针 则用 “->” 如果是结构体 则用 “.”直接访问,这是c与c++之间的区别实现结果如下:#include <stdio.h>#define maxsize 30#define elemtype int#define bool int#define false 0#define true 1typedef struct { elemtype data[maxsize]; int top;}sqstack;/原创 2020-07-04 15:38:49 · 136 阅读 · 0 评论 -
单链表的逆序
我是以王道考研数据结构的题目进行写的,算法的思想都是一样的。希望学弟学妹们好好学习数据结构,不然等着以后后悔。#include<stdio.h>#define elemtype int#define null 0typedef struct LNode{ elemtype data; struct LNode *next;}LNode, *LinkList;void InitLinkList(LinkList *L,elemtype a[],int leng原创 2020-07-03 10:46:18 · 189 阅读 · 0 评论 -
单链表的操作的实现,增 删 改 查
我这篇是线性表的链式存储的基本操作的实现!我会在接下来的时间把数据结构的基本的操作全部实现觉得RGG写的不错,对你有一点儿帮助的话,请点个赞吧呜呜呜。(先赞后看,文明观看)不多说,上代码多看我的注释,我把一些要注意的问题都写在上面了。对了,我想个这个系列取个名字,欢迎大家评论啊!我倒要看看哪个幸运鹅是第一个给我评论的哈哈哈!#include<stdio.h>#define elemtype int#define null 0//定义单链表/*******1,其中包含一个原创 2020-06-28 17:22:16 · 195 阅读 · 1 评论 -
用C实现在整数数组中找出未出现的最小正整数
用C实现在整数数组中找出未出现的最小正整数;算法思想:在一个整数数组a[n]中未出现的最小正整数只可能是1到n+1;有了这个知识点,那么算法就好实现了,我么另建一个长度为n的整数数组b[n],然后往里面全部填0;再遍历数组a[n],只要是数组里面有再1和n+1之间的值,我们就把b中对应位置的值改为1,这里要注意a[i]的值与b[n]中第几个数之间的对应关系然后再遍历b[ ]找出那个数就可以了,下面是我写的代码#include<stdio.h>int main(){ int原创 2020-06-24 15:32:47 · 1518 阅读 · 1 评论 -
用C语言实现顺序表的所有基本操作,另加折半查找等等,内含详细注释
不说多的,直接上代码。。。我已经把所有的操作实现,你可以再main()中自己选择要进行的操作。#include "stdio.h"#include "windows.h"#include "stdlib.h"#define Maxsize 30 //顺序表最大的长度//定义顺序表typedef struct{ int data[Maxsize]; int length;}SqList;//初始化顺序表 void InitList(SqList *L){原创 2020-06-23 13:42:16 · 270 阅读 · 0 评论