数据结构
文章平均质量分 54
Zevin~
这个作者很懒,什么都没留下…
展开
-
跳表
跳表中的元素是有序的,因此支持高效的区间操作,比如查找某个区间内的元素,时间复杂度是O(log n+k),其中k是区间内的元素个数。:跳表的结构可以支持并发操作,多个线程可以同时对跳表进行读操作,而不需要加锁。:跳表中的元素是有序的,可以使用二分查找的方式快速定位元素,时间复杂度是O(log n)。而在数组中,查找元素的时间复杂度是O(n)。通过跳过一些元素,跳表可以快速地定位到需要查找的元素,从而提高了查找的效率。跳表的实现相对简单,而且可以支持并发操作,因此在实际应用中被广泛使用,比如。原创 2023-03-23 13:38:03 · 219 阅读 · 0 评论 -
AVL Tree
但因为他是一个高度平衡的搜索二叉树,所有在构建的过程中,就需要多次的进行旋转。每个节点都有对应的平衡因子,其平衡因子的绝对值不能超过1。也就是说每个节点的左右子树的高度差不超过1。AVL树是一个高度平衡的搜索二叉树。原创 2023-02-26 15:02:54 · 81 阅读 · 0 评论 -
红黑树
红黑树是一个相对的平衡,减少了旋转的消耗最长路径不超过最短路劲的2倍最短路径:全黑最长路径: 一黑一红假设每条路径黑节点是N,路径要数到空位置左右两边没那么均衡:整体的高度假设红黑树中一中路径黑色节点=x高度2x>=h>=x全黑 一黑一红22x-1:N为节点个数。原创 2023-02-26 14:46:51 · 385 阅读 · 0 评论 -
图
边和边之间关系通过矩阵数组来保存关系A,B之间相连所以matrix[A][B]=1。原创 2023-01-07 17:31:38 · 1910 阅读 · 0 评论 -
哈希
闭散列:开放定址法,当发生hash冲突的时候,如果哈希表未被装满,说明在哈希表中必然还有空的位置,那么就把key存放到下一个“空位置”中去。1.统计每个数字出现次数,范围很集中,可以使用,但是对于随机的一堆整数,就按照范围来开空间,很分散,最好不要这样,假如关键字1234,就把它平方=1522356,取中间3位,223,如果它不够3位,就继续对他进行平方,直到取出3位位置,也存在哈希冲突。本质上就是映射,找到一个值进行映射,把数据映射到对应的地方。冲突的时候,就往后进行探测,直到到达空位置,原创 2022-10-12 16:46:51 · 445 阅读 · 0 评论 -
map和set的实现
红黑树修改版本RBTreeNode树里面的每一个节点树的迭代器IteratorRBTree。原创 2022-09-18 23:51:15 · 167 阅读 · 2 评论 -
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3。...原创 2022-08-30 15:12:35 · 453 阅读 · 0 评论 -
二叉树的层序遍历及其变形
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]使用队列,队头出队带入他的左右节点。输入:root = [1]输入:root = []...原创 2022-08-30 12:21:51 · 1110 阅读 · 0 评论 -
二叉搜索树
假如我们要查找7:7比3大,到3的右子树=5,7比5大,到5的右子树7,查找到了。例如:我们链接上的节点为10,走到9的右,root即是空,也是9右指针的别名。例如删除10,右为空,10 是9的右节点,把10的左节点,连接到9的右节点上。点往下走,比它大,走右边,比它小走左边,相等就找到了,走到空就说明没找到。10>8,先走右边,到9,10>9走右边,走到了空,把它插入到这个地方。例如删除3,左为空,3是1的右节点,把1的右节点,连接到3的右节点。左子树的值小于根,右子树的值大于根。...原创 2022-08-28 01:23:03 · 127 阅读 · 7 评论 -
运用反转链表的思想实现力扣题
文章目录从尾到头打印链表回文链表从尾到头打印链表link.输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2] 输出:[2,3,1]int* reversePrint(struct ListNode* head, int* returnSize){ if(head==NULL) { *returnSize=0; return NULL; }//先反转链表struct原创 2022-01-01 21:25:33 · 350 阅读 · 0 评论 -
链表取节点尾插力扣刷题
文章目录合并两个有序链表移除链表元素分割链表合并两个有序链表link.将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = [] 输出:[]示例 3:输入:l1 = [], l2 = [0] 输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.va原创 2022-01-01 20:01:50 · 410 阅读 · 10 评论 -
二叉树深入剖析
文章目录**二叉树的遍历(前序,中序,后序)**计算二叉树的节点的个数计算第k层的节点二叉树的深度查找一个节点层序遍历判断是否为完全二叉树test.c二叉树的基本结构用指针来指向两个子树节点,依次来把节点来连接起来二叉树的遍历(前序,中序,后序)#include<stdio.h>#include<stdlib.h>typedef char btdata;typedef struct BinaryTreeNode{ //指针域 struct原创 2021-12-20 22:24:25 · 667 阅读 · 5 评论 -
树的完整概念与堆的深度剖析
tree.cheap.hheap.c堆的应用1.topk问题2.堆排序这篇博客会完整的对于树,堆的概念,堆的应用(topk问题,堆排序)进行深度的剖析tree.c`#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>//如何表示一个树呢(代码实现如何定义结构)//法1.假设说明了树的度是N(最大是这么多) struct treenode{ int data; struct treenode*subs[N.原创 2021-12-16 17:05:57 · 403 阅读 · 7 评论 -
队列精华总结
队列遵循的原则是先进先出打印的数无论按什么时间出都是一样的queue.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<stdbool.h>typedef int queuedata;typedef struct queuenode{ struct que..原创 2021-12-01 18:46:38 · 225 阅读 · 0 评论 -
栈
栈:一种特殊的线性表,其只允许在固定的一段进行插入和删除元素,进行插入和删除元素的一端叫做栈顶,另一端叫做栈底,栈中的元素遵守着先进后出的原则stack.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<stdio.h>#include<stdbool.h>#include<assert.h>#include<stdlib.h>typedef int stdata;..原创 2021-11-25 21:48:51 · 930 阅读 · 0 评论 -
环形链表
...原创 2021-11-25 21:35:33 · 110 阅读 · 2 评论 -
顺序表力扣题
目录移除元素法一,暴力覆盖法二,数组接收法3双指针判断合并两个有序数组移除元素法一,暴力覆盖移除元素给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引...原创 2021-11-25 21:07:43 · 92 阅读 · 0 评论 -
顺序表
顺序表的详细介绍原创 2021-11-21 16:16:01 · 715 阅读 · 4 评论 -
力扣刷题—链表反转
法一:反转指针/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* reverseList(struct ListNode* head){if(head==NULL)return NULL;struct ListNode*n1=NULL;//n1作为返回的头...原创 2021-11-11 23:24:41 · 265 阅读 · 3 评论 -
带头双向循环链表
我们以及学习了无头单链表,可以发现它有点麻烦1.单链表不能从后面往前2.找不到它的前驱(上一个地址)(尾插,尾删,中插,中删)都要找到它的前一个节点3.没有带头的节点:要用二级指针进行传参,不用改变传过来指针那么我们可以介绍一下带头双向循环链表的好处1.带头节点的好处:不存储有效数据,带哨兵位的头节点不存入链表的长度,使得尾插更加方便,每次都在头后进行连接2.双向的好处:方便找到他的前一个节点3.循环的好处:头指向尾,尾指向头,头的前一个节点就是尾,方便找尾.原创 2021-11-10 23:26:07 · 766 阅读 · 7 评论 -
单链表完整版
实现单链表的头插头删,尾插尾删,中间插入,中间删除,查找slist.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<stdio.h>#include<stdlib.h>typedef int slistdate;//对int重命名,只会方便把int改成double或其他数据类型struct slistnode{ slistdate date;// struct slistnode*next;//原创 2021-11-04 10:57:00 · 195 阅读 · 4 评论