
数据结构
常用数据结构解析
FlushHip
凝视深渊
展开
-
字符串字典树判重Linux内核代码风格
背景:LeetCode - 127. Word Ladder 解决: 简单的广搜,用C++真的太好实现了,STL确实强大,但是用C语言来写呢?其实关键点就在于字符串如何判重,STL里的set可以搞,但是注意C里面没有这个东西,所以要么我们自己手写一个红黑树来实现set(红黑树不好写!很麻烦),要么就使用字典树(这个确实相对来说好些得多)。写这个题其实也是自己想多学学C语言中一些高级的东西,所以就原创 2017-05-04 00:17:13 · 880 阅读 · 0 评论 -
二叉树前序、中序、后序遍历的非递归写法
由于考研需要考到这个知识,因此写了代码实现了下,顺便整理下.前序和中序遍历的非递归写法都比较好实现,后序遍历稍微复杂一些.数据结构定义:struct Node{ char c; pNode lchild, rchild; Node(char c, pNode lchild = nullptr, pNode rchild = nullptr) : c(c), l原创 2017-10-25 18:19:07 · 7036 阅读 · 2 评论 -
二叉排序树删除某一指定结点
二叉排序树中删除一个结点对其祖先是没有影响的,但是对其子孙有影响.先回顾下二叉排序树的定义: 空树是二叉排序树; 左子树所有结点的值小于根节点,右子树所有结点的值大于根节点,递归定义. 设删除的那个结点为root,那么就要在左子树中找一个最大的结点来替换root或者在右子树中找一个最小的结点来替换root看图:这是一颗二叉排序树,我们删除73这个结点,就会得到下面这张图:可以看到原创 2017-11-18 00:53:12 · 6540 阅读 · 0 评论 -
控制台下字典序蛇形打印目录树
在控制台下做到类似下图的效果:具体题目背景:[点这儿].题目: 在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。输入格式: 输入首先给出正整数N(≤104)N(≤10^4),表示ZIP归档文件中的文件和目录的数量。随后NN行,每行有如下格式的文件或目原创 2017-11-19 01:43:13 · 635 阅读 · 0 评论 -
树状数组简单易懂的详解
树状数组确实是个好东西啊,以前搞比赛的时候了解过它,会套用模版,但确没有深入理解这个东西,先学会用轮子,然后再学造轮子嘛,这段时间再回头研究了一下,发现二进制在算法中真的是的好东西,它可以使算法的时间复杂度降到n的二进制表示中的1相关,大家都知道,求一个二进制中的1的个数,这个时间复杂度为O(logn)" role="presentation" style="position: relative;原创 2018-01-25 19:29:05 · 63166 阅读 · 59 评论 -
完全理解ST稀疏表在线处理RMQ问题及RGQ问题
ST是什么STSTST的全称是SparseTableSparseTableSparse\quad Table。谷歌上的解释如下: Sparse Table is a data structure that answers static Range Minimum Query (RMQ). It is recognized for its relatively fast query an...原创 2018-07-20 13:52:59 · 1501 阅读 · 0 评论 -
判断一棵树是不是二叉搜索树
背景:LeetCode - 98. Validate Binary Search Tree 方法: 我们先要看看二叉搜索树的定义,根节点的值要大于左子树的任意节点的值,小于右子树任意节点的值,而且左右子树都是二叉搜索树。 那我们我们要获取左右子树的最大值和最小值,用左子树的最大值与右子树的最小值比较。满足大小关系,而且左右子树都是二叉搜索树这个时候这棵树就是二叉搜索树,同时,利用求出来的左原创 2017-04-28 21:20:46 · 1431 阅读 · 0 评论 -
用链表实现大整数加法
背景:LeetCode - 2. Add Two Numbers描述: 给你两个不为空的链表,而且链表中的数字是反序的,现在要你求出这两个链表所代表的数字的和,同样用链表表示。链表的定义: // Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNo原创 2017-04-25 15:25:39 · 6699 阅读 · 0 评论 -
EK算法
EK原理EK算法是求网络流最大流的算法。也称为寻找增广路算法,每次寻找一条增广路,求出这条路上最小的容量(木板原理),然后累加起来,直到最后找不到一条增广路为止。注意,在找到最小容量的时候,前向边要减去最小容量,而后向边要加上最小容量。这是为了形成能改正之前寻找增广路错误的残余网络,实际上这就是把之前的容量退回去,形成新的可行路径。Code#include <stdio.h>#include <原创 2016-07-28 09:39:30 · 1332 阅读 · 0 评论 -
次小生成树
Description: 次小生成树是次于最小生成树的一个生成树,也就是说存在一种大于且仅仅大于最小生成树的一种连接所有点的方式来连通一个图。 Solution: 我们知道,次小生成树可以由图中不属于最小生成树的边替换最小生成树上一条最大的边来获得。这是为什么呢。我们知道在已经生成了最小生成树的图中,添加一条不属于最小生成树的边势必会形成一个环,那么这个时候我们就要在最小生成树上删掉一条边。这样就原创 2016-03-29 11:20:24 · 601 阅读 · 0 评论 -
DINIC算法
DINIC原理 DINIC算法和EK算法原理其实是一样的,都是寻找增广路,但是在实现的细节上不同,首先,用bfs对顶点进行层次编号,当汇点不在层次图中的时候算法结束;其次,用dfs寻找增广路,在dfs中,用一个顶点扩展时,其实计算了多条增广路,这也是这个算法比EK算法快的原因。Code#include <stdio.h>#include <string.h>#include <io原创 2016-07-28 10:36:15 · 1184 阅读 · 0 评论 -
MCMF算法
最小费用最大流算法: 以费用作为权值,求出最小费用链,然后在这条链上求得一个最小流量,直到找不到费用链。求最小费用链也就相当于求src−>dessrc->des的最短路径。使用spfa+EKspfa+EK算法。得到MCMFMCMF算法代码:#define MIN(a,b) ((a)>(b)? (b):(a))using namespace std;const int INF=0x3f3f3f3原创 2016-08-04 15:34:27 · 2610 阅读 · 0 评论 -
最小环
算法: 在一个图中求出一个路径长度最小的环。首先,我们可以想到迪杰斯特拉算法,计算出dis[src,i]dis[src,i]+map[i][src]map[i][src],然后维护一个最大值就好了。但是这样做的话,在计算dis[src,i]dis[src,i]时有可能会把map[i][src]map[i][src]包含进去,那么怎么办呢,我们可以枚举每一条边,先删掉,然后求dis[src,i]d原创 2016-08-08 09:52:27 · 840 阅读 · 0 评论 -
求无向图中的三元环个数
无向图是个稀疏图,点数n<105n<10^5, 边数m<min(105,n∗(n−1)2)m<min(10^5, \frac{n*(n - 1)}{2}).现在给出n,m,E(边的集合)n, m,E(边的集合)。求出这个无向图中三元环的个数,两个三元环不同是:当对于两个三元环的边,某个三元环存在一条边在另一个三元环的边中无法找到!首先想到的方法只能是暴力求解,很直接的暴力就是枚举每一条边,以一条边度原创 2017-04-16 14:36:47 · 7089 阅读 · 6 评论 -
单链表逆转
本题要求实现一个函数,将给定的单链表逆转。函数接口定义:List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToN原创 2017-04-12 15:30:16 · 777 阅读 · 0 评论 -
顺序表操作集
本题要求实现顺序表的操作集。函数接口定义:List MakeEmpty(); Position Find( List L, ElementType X );bool Insert( List L, ElementType X, Position P );bool Delete( List L, Position P );其中List结构定义如下:typedef int Position;ty原创 2017-04-12 16:00:38 · 1311 阅读 · 0 评论 -
求链式表的表长
本题要求实现一个函数,求链式表的表长。函数接口定义:int Length( List L );其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LNode { ElementType Data; PtrToLNode Next;};typedef PtrToLNode List;L是给定单链表,函数Length要返回链式表原创 2017-04-12 16:07:10 · 1806 阅读 · 0 评论 -
链式表的按序号查找
本题要求实现一个函数,找到并返回链式表的第K个元素。函数接口定义:ElementType FindKth( List L, int K );其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LNode { ElementType Data; PtrToLNode Next;};typedef PtrToLNode List原创 2017-04-12 16:20:05 · 1122 阅读 · 0 评论 -
链式表操作集
本题要求实现链式表的操作集。函数接口定义:Position Find( List L, ElementType X );List Insert( List L, ElementType X, Position P );List Delete( List L, Position P );其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LN原创 2017-04-12 17:13:22 · 2241 阅读 · 0 评论 -
带头结点的链式表操作集
本题要求实现带头结点的链式表操作集。函数接口定义:List MakeEmpty(); Position Find( List L, ElementType X );bool Insert( List L, ElementType X, Position P );bool Delete( List L, Position P );其中List结构定义如下:typedef struct LNode原创 2017-04-12 17:28:51 · 1422 阅读 · 0 评论 -
在一个数组中实现两个堆栈
本题要求在一个数组中实现两个堆栈。函数接口定义:Stack CreateStack( int MaxSize );bool Push( Stack S, ElementType X, int Tag );ElementType Pop( Stack S, int Tag );其中Tag是堆栈编号,取1或2;MaxSize堆栈数组的规模;Stack结构定义如下:typedef int Positi原创 2017-04-13 00:22:46 · 2389 阅读 · 1 评论 -
求二叉树高度
本题要求给定二叉树的高度。函数接口定义:int GetHeight( BinTree BT );其中BinTree结构定义如下:typedef struct TNode *Position;typedef Position BinTree;struct TNode{ ElementType Data; BinTree Left; BinTree Right;};要求函数原创 2017-04-13 00:28:06 · 962 阅读 · 0 评论 -
二叉树的遍历
本题要求给定二叉树的4种遍历。函数接口定义:void InorderTraversal( BinTree BT );void PreorderTraversal( BinTree BT );void PostorderTraversal( BinTree BT );void LevelorderTraversal( BinTree BT );其中BinTree结构定义如下:typedef st原创 2017-04-13 00:48:48 · 1638 阅读 · 0 评论