
数据结构
文章平均质量分 72
C语言数据结构
giturtle
Stay hungry, stay foolish. Lu
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[C++] 不申请额外空间,逆序一个栈
第一次看到题目的时候,自然会联想到用函数栈帧来代替栈的内存,从而达到不申请额外空间的效果。思路设定一个函数作为入口函数,接收原始stack数据。入口函数中调用一个接口,接口会提取栈的最底元素后返回,在入口函数中接收它,这样在这个栈帧中就保存了这个元素值,在后续的流程中第一个接收的元素会在顺序的最后重新压入。递归调用入口函数,让他继续对栈进行操作,进行后续“提取最底元素”。当栈所有的最底元素提取完,此时栈为空了,此时层层函数的栈帧中tail字段保存了原来栈每一层的元素,要进行重新入栈了。从递归调转载 2022-05-16 00:19:24 · 453 阅读 · 0 评论 -
[C++] 图结构
之间使用vector实现过简单的并查集,但在刷题过程中,发现有关于图的例题中其效率不是很高,因为需要轮询,下面介绍的这种图结构可以满足大部分需要,模板提供给大家。点结构class Node {public: int val; int in; // 入度: 指向此点的边个数 int out; // 出度: 从此点发出的边个数 vector<Node*> nexts; // 直接邻接点 vector<Edge*> edges; // 边 Node(int val原创 2022-05-11 22:33:09 · 904 阅读 · 1 评论 -
二叉树Morris遍历代码记录
morris序ListNode *morris(ListNode *head) { ListNode *cur = head; ListNode *mostRight = nullptr; while (cur != nullptr) { mostRight = cur->left; // 判断cur有无左树 if (mostRight != nullptr) { // 有左树,找到真实最右节点 while (mostRight->right != nullpt原创 2022-05-08 23:30:42 · 675 阅读 · 1 评论 -
[C++] JZ75 字符流中第一个不重复的字符
目录例题描述解题思路一:队列+bitmap代码实现解题思路二:双bitmap代码实现例题描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go"时,第一个只出现一次的字符是"g" 。当从该字符流中读出前六个字符 “google"时,第一个只出现一次的字符是"l"。数据范围:字符串长度满足1≤n≤1000,字符串中出现的字符一定在ASCII码内。后台会用以下方式调用Insert和 FirstAppearingOnce函数string caseout原创 2022-03-22 23:30:28 · 779 阅读 · 1 评论 -
[C++] 局部反转链表
目录例题描述解题思路代码实现例题描述给定单链表的某一段区间,即传参为某两个节点,反转两节点区间之内的所有节点,对于区间外的节点不需操作。传参保证节点a对于节点b,一定在链表的上游。示例:对于某一链表:1->2->3->4->5->NULL,入参为节点值为2和5的节点地址a和b,调用完成后结果为:输出: 5->4->3->2结构体定义struct ListNode { int val; struct ListNode *next原创 2022-03-20 16:44:07 · 1534 阅读 · 0 评论 -
[C++] k个一组反转链表
目录例题描述解题思路代码实现例题描述此问题为反转单链表的引申问题之一,在单链表翻转的基础上增加一些边界控制,使链表完成k个节点一组的特殊化反转。最终返回反转后的链表头节点。这里给出原问题链接:【反转一个单链表】https://blog.youkuaiyun.com/qq_42351880/article/details/88637387此算法入参有两个:链表头节点、每组节点数k示例:输入: 1->2->3->4->5->6->NULL如果参数k = 2, 输原创 2022-03-20 16:01:20 · 1584 阅读 · 1 评论 -
[C++] JZ82/34/84 二叉树中和为某一值的路径
目录题目描述解题思路代码实现进阶:打印出每一条合法路径解题思路代码实现题目描述给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum的路径。该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点叶子节点是指没有子节点的节点路径只能从父节点到子节点,不能从子节点到父节点总节点数目为n例如:给出如下的二叉树返回true,因为存在一条路径 5→4→11→2的节点值之和为 22/数据范围:树上的节点数满足0 ≤ n ≤ 10000每个节点原创 2022-03-10 23:15:01 · 285 阅读 · 2 评论 -
[C++] 二叉搜索树的第k个节点
题目描述给定一棵结点数为n二叉搜索树,请找出其中的第k 小的TreeNode结点值。返回第k小的节点值即可不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1保证n个节点的值不一样数据范围:0 ≤ n ≤ 10000,0 ≤ k ≤ 10000,树上每个结点的值满足0 ≤ val ≤ 1000。如输入{5,3,7,2,4,6,8},3时,二叉树{5,3,7,2,4,6,8}如下图所示:该二叉树所有节点按结点值升序排列后可得[2,3,4,5,6,7,8],所以第3个结点的原创 2022-03-09 22:31:34 · 1274 阅读 · 0 评论 -
C++实现简单的 并查集
#include <iostream>#include <vector>using namespace std;//并查集class UnionFindSet{ public: UnionFindSet(size_t n){ _ufs.resize(n,-1); } int FindRoot(int x){ ...原创 2019-08-26 01:17:25 · 317 阅读 · 0 评论 -
C++实现简单的 图
#include <iostream>#include <vector>#include <string>#include <queue>#include <assert.h>using namespace std;template<class V,class W,bool IsDirect = false> ...原创 2019-08-26 01:16:39 · 310 阅读 · 0 评论 -
[C++] B树的简单实现
template<class K,size_t M = 1024>struct BTreeNode{ K _key[M]; BTreeNode<K,M>* _sub[M+1]; //多给一个方便分裂 BTreeNode<K,M>* _parent = nullptr; size_t _keysize;};template<cl...原创 2019-08-22 00:56:45 · 369 阅读 · 1 评论 -
[C++] 红黑树(RBTree)的模拟实现
代码实现#pragma onceenum Colour{ RED, BLACK,};template<class T>struct RBtreeNode{ RBtreeNode<T>* _left; RBtreeNode<T>* _right; RBtreeNode<T>* _parent; T _val; Col...原创 2019-07-26 23:28:38 · 447 阅读 · 0 评论 -
[C++ ]二叉搜索树(BSTree)的模拟实现
#pragma oncetemplate<class K, class V>struct BSTreeNode{ pair<K, V> _kv; BSTreeNode<K, V>* _left; BSTreeNode<K, V>* _right; BSTreeNode(const pair<K, V>& kv) ...原创 2019-07-25 09:34:19 · 269 阅读 · 1 评论 -
[C++] AVL树的模拟实现
AVL树的定义:一棵树中的所有子树的高度差都不能超过 1。AVLTree.h#pragma oncetemplate<class K, class V>struct AVLTreeNode{ pair<K, V> _kv; AVLTreeNode<K, V>* _left; AVLTreeNode<K, V>* _right; AV...原创 2019-07-25 09:34:32 · 365 阅读 · 0 评论 -
[数据结构] 二叉树的最近公共祖先
目录例题描述代码实现例题描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例1:输入: root = [3,5,1,6,2,0,8,null,null,7,4]输出: 3解释:节点...原创 2019-04-14 21:19:42 · 541 阅读 · 0 评论 -
[数据结构] 二叉树转双向链表
目录例题描述代码实现例题描述将该二叉树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二叉树结点结构体定义struct TreeNode { struct TreeNode *left; struct TreeNode *right;};代码实现Node *prev = NULL; // 保证按有序的顺序调用该函数void NodeToDo...原创 2019-04-14 21:16:24 · 1364 阅读 · 0 评论 -
[数据结构] 二叉树典例
目录1. 给定二叉树,返回其前序遍历2. 相同的树3. 另一个树的子树4. 二叉树的最大深度5. 平衡二叉树6. 对称二叉树7. 二叉树遍历二叉树结点结构体定义struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;};1. 给定二叉树,返回其前序遍历int *array;int si...原创 2019-04-07 23:31:20 · 391 阅读 · 0 评论 -
C++ 设计循环队列
目录例题描述解题思路代码实现例题描述设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是:可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。...原创 2019-04-05 13:59:40 · 2221 阅读 · 0 评论 -
C++ 用栈实现队列
目录例题描述解题思路图文出队代码实现例题描述使用栈实现队列的下列操作:push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。top() – 返回队列首部的元素。empty() – 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.top()...原创 2019-04-05 11:05:50 · 1846 阅读 · 0 评论 -
C++ 用队列实现栈
目录例题描述解题思路图文弹栈代码实现例题描述使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许...原创 2019-04-05 00:57:45 · 1390 阅读 · 2 评论 -
C++ 实现一个最小栈
目录例题描述解题思路压栈弹栈获取栈顶元素检索栈中最小值代码实现例题描述设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top()– 获取栈顶元素。getMin() – 检索栈中的最小元素。示例:MinStack minStack = new MinStack();min...原创 2019-04-05 11:32:03 · 1305 阅读 · 0 评论 -
【图文解析】链表分割
目录例题描述解题思路代码实现例题描述编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。(注意:分割以后保持原来的数据顺序不变)示例:输入:9->5->2->7,x = 4输出:2->9->5->7结点结构体定义ty...原创 2019-04-04 00:31:21 · 899 阅读 · 0 评论 -
【图文解析】复制带随机指针的链表(返回链表的深拷贝)
例题描述给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空节点。要求返回这个链表的深拷贝。示例:输入:{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}解释:节点 1 的值是 1,它的下一...原创 2019-04-05 00:21:24 · 958 阅读 · 0 评论 -
【图文解析】判断链表的回文结构
目录例题描述例题描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。示例:输入:1->2->2->1输出:true结点结构体struct ListNode { int val; struct Li...原创 2019-04-02 23:34:14 · 477 阅读 · 0 评论 -
【图文解析】返回链表开始入环的第一个结点
目录例题描述方法一代码实现方法二代码实现例题描述给定一个链表,返回链表开始入环的第一个结点。 如果链表无环,则返回 NULL。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。【说明:不允许修改给定的链表】示例 1:输入:head = [3,2,0,-4], pos = 1输出:ta...原创 2019-04-02 22:32:09 · 1666 阅读 · 8 评论 -
【图文解析】给定一个链表,判断链表中是否有环
目录例题描述解题思路代码实现例题描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例一:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个结点。示例二:输入:head = [1...原创 2019-04-01 23:03:01 · 3175 阅读 · 0 评论 -
【图文解析】找到两个单链表相交的起始结点
目录例题描述解题思路代码实现例题描述编写一个程序,找到两个单链表相交的起始结点。如下面的两个链表,在结点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = ...原创 2019-04-01 21:48:07 · 2056 阅读 · 7 评论 -
C++ 实现括号有效性匹配问题
解题思路创建一个char类型的栈。将传入的字符串s进行逐字节遍历,因为情景条件固定三种,所以使用switch语句。如果是{}、()、[]中的左括号就通过push()入栈。如果是右括号,就进行比较。1)如果为此时空栈empty(),说明没有与右括号匹配的左括号,右括号个数多于左括号个数,一定不会皮城成功,此时直接返回false。2)如果不是空栈,取出栈顶元素与当前右括号匹配。如果成功...原创 2019-03-31 22:54:26 · 1079 阅读 · 0 评论 -
【图文解析】删除链表中连续重复的结点
目录例题描述解题思路代码实现小结例题描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。示例:输入:1->2->3->3->4->4->5输出:1->2->5结点结构体定义struct ListNode { int val; struct ListNode *next;};...原创 2019-03-26 23:09:10 · 980 阅读 · 0 评论 -
【图文解析】链表中倒数第 k 个结点
目录例题描述解题思路代码实现小结例题描述输入一个链表,输出该链表中倒数第k个结点。示例:输入:1->2->4->1->3->4,k = 3输出:此列表中的结点 1 (序列化形式:[1,3,4])结点结构体定义struct ListNode { int val; struct ListNode *next;};解题思路前后指针法:建...原创 2019-03-26 13:35:57 · 2435 阅读 · 0 评论 -
【图文解析】合并两个有序链表
目录例题描述解题思路代码实现小结例题描述将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4,1->3->4输出:1->1->2->3->4->4结点结构体定义struct ListNode { int val; struct ListNode *next;...原创 2019-03-25 23:03:11 · 1478 阅读 · 2 评论 -
【图文解析】返回单链表的中间结点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。原创 2019-03-25 15:48:16 · 1835 阅读 · 0 评论 -
【图文解析】反转一个单链表
目录例题描述思路一代码实现分析思路二代码实现分析例题描述反转一个链表示例:输入: 1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;NULL输出: 5-&gt;4-&gt;3-&gt;2-&gt;1-&gt;NULL结构体定义struct ListNode { int val; struct ListNode *next原创 2019-03-18 15:26:38 · 76114 阅读 · 32 评论 -
【图文解析】删除顺序表中等于给定值 val 的所有结点
目录例题描述思路一代码实现分析思路二代码实现分析例题描述删除顺序表表中所有等于某给给定值的所有结点。示例 :输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5结构体定义typedef int SLDataType;struct SeqList{ SLDataType* a...原创 2019-03-18 09:13:48 · 928 阅读 · 0 评论 -
【图文解析】删除链表中等于给定值 val 的所有结点
例题描述删除单链表中所有等于某给给定值的所有结点。示例 :输入: 1-&amp;amp;amp;amp;amp;gt;2-&amp;amp;amp;amp;amp;gt;6-&amp;amp;amp;amp;amp;gt;3-&amp;amp;amp;amp;amp;gt;4-&amp;amp;amp;amp;amp;gt;5-&amp;amp;amp;amp;amp;gt;6, val = 6输出: 1原创 2019-03-18 00:19:08 · 1600 阅读 · 0 评论 -
[数据结构] 动图演示 + 代码实现八大排序(插入、希尔、选择、堆、冒泡、快速、归并、基数/桶)
排序插入排序希尔排序选择排序堆排序冒泡排序快速排序归并排序#pragma once#include <stdio.h>void Swap(int array[], int i, int j) { int t = array[i]; array[i] = array[j]; array[j] = t;}插入排序/*数据越有序,速度越快时间复杂度最快:O(n......原创 2019-04-18 18:22:04 · 1761 阅读 · 2 评论 -
C++实现二叉树层序遍历、前中后序等
目录利用队列实现层序遍历判断是否为完全二叉树用栈实现前、中、后序(非递归方式)栈实现前序栈实现中序栈实现后序利用队列实现层序遍历广度优先遍历void LevelOrder(Node *root) { if (root == NULL) { printf("\n"); } // 启动 std::queue<Node *> q; q.push(root); wh...原创 2019-04-14 21:05:14 · 429 阅读 · 0 评论 -
[数据结构] C/C++重建二叉树
#pragma once#include "BinaryTree.h"#include <stdbool.h>bool isSame(Node*p, Node*q) { if (p == NULL && q == NULL) { return true; } if (p == NULL || q == NULL) { return false;...原创 2019-04-14 21:06:08 · 11188 阅读 · 1 评论 -
[数据结构] 二叉堆
堆二叉堆堆的操作堆化(Heapify)建堆封装堆的接口在一个结构中,本质是构建成为静态顺序表。插入出堆,每次出的是当前最小值如果把之前是链式存储的二叉树存入数组,变成顺序存储的方式,更多应用在完全二叉树。已知根下标 rootIndex孩子结点:leftIndex = 2 * rootIndex + 1rightIndex = 2 * rootIndex + 2已知孩子下标 child...原创 2019-04-12 00:53:20 · 199 阅读 · 0 评论 -
【数据结构】顺序栈的实现(动态版)
动态顺序栈定义初始化 ----Init返回栈顶元素 ----Top入栈 ----Push出栈 ----Pop本博客我们利用动态顺序表实现栈。与静态顺序表的区别就是灵活性更高。我们动态顺序栈存放的是自栈底到栈顶的数据元素,通过双指针控制。栈顶指针top:指示顺序栈中的栈顶位置,其初值指向栈底,即top = base可作为栈空的标记,每当插入新的栈顶元素时,指针top增加1;删除栈顶元素时,...原创 2019-04-01 20:37:17 · 1619 阅读 · 2 评论