数据结构与算法
文章平均质量分 68
从零开始学习的ZHL
已工作但很弱鸡的学习者
展开
-
层序遍历
class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>>res; if(pRoot==nullptr) return res; ...原创 2018-05-22 19:20:54 · 766 阅读 · 0 评论 -
线段树
线段树是一种平衡二叉搜索树,它将一个线段区间划分成一些单元区间。对于线段树中的每一个非叶子结点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为【(a+b)/2+1,b】,最后的叶子结点数目为N,与数组下标对应。线段树一般包括建立、查询、插入、更新等操作,建立规模为N的时间复杂度是O(NlogN),其他时间复杂度是O(logN)用数组保存线段树的构造传入参数:线段树数组v...原创 2018-07-04 18:26:21 · 212 阅读 · 0 评论 -
单链表
创建,测长,打印,删除,插入,逆置,排序:#include<iostream>#include<stdio.h>#include<string.h>#include<conio.h>using namespace std;typedef struct student{ int data; struct student *next;...原创 2018-07-11 21:08:53 · 110 阅读 · 0 评论 -
双链表
建立,插入,删除#include<iostream>#include<stdio.h>#include<string.h>#include<conio.h>using namespace std;typedef struct student{ int data; struct student *next; struct stude...原创 2018-07-11 22:34:16 · 119 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树也是一种查找树,所以插入的数据也要满足左孩子比自己小,右孩子比自己大。并且要保持左右孩子的高度差不超过1.插入分为4种情况:LL插入,RR插入,LR插入,RL插入。调整的方法4种与之分别对应:LL旋转,RR旋转,LR旋转,RL旋转。LL插入,就是在结点的左子树的左孩子上面插入了新的数据,导致平衡性被破坏。所以进行LL旋转,以下同理RR插入:LR:第...原创 2018-07-18 16:45:50 · 187 阅读 · 0 评论 -
队列
入队,出队#include<iostream>#include<stdio.h>#include<string.h>#include<conio.h>using namespace std;typedef struct student{ int data; struct student *next;}node;typedef s...原创 2018-07-12 20:15:16 · 129 阅读 · 0 评论 -
两个栈实现一个队列
一个栈A,一个栈B。入队列:入栈A出队列:如果栈B不空,直接出栈B。如果栈B为空,则依次弹出栈A,并进入到栈B,再pop栈B#include<iostream>#include<stack>using namespace std;template<class T>struct MyQueue{ stack<T> s1; stack&...原创 2018-07-12 21:00:53 · 109 阅读 · 0 评论 -
二叉树的性质
转自:https://www.cnblogs.com/willwu/p/6007555.html树的介绍1. 树的定义树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:(01) 每个节点有零个或多个子节点;(02) 没有父节点的节点称为根节点;(0...转载 2018-08-02 23:08:44 · 156 阅读 · 0 评论 -
找出数组中第K大或者是第K小的数(利用快速排序)
快速排序一趟之后,主元pivot到了他最终应该在的位置,如果是从小到大排序,那么一趟排序之后,他左边的数都是比它小的,他右边的数都是比它大的数,所以,如果我们要找出第K小的数,我们可以在一趟排序后,检查主元的位置和K是否对应if(pos+1 == k),因为下标是从0开始的,所以要加1。如果相等的话,就正好是要找的第K小的数,否则,if(pos+1>k),说明要找的数在主元的左边,我们就...原创 2018-08-03 11:55:11 · 8947 阅读 · 6 评论 -
栈和队列的一些相同点和不同点
栈与队列的相同点:1.都是线性结构。2.插入操作都是限定在表尾进行。3.都可以通过顺序结构和链式结构实现。、4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。5.多链栈和多链队列的管理模式可以相同。栈与队列的不同点:1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达...原创 2018-08-23 09:07:36 · 27523 阅读 · 1 评论 -
bitmap以及一些常见应用
转自:https://blog.csdn.net/hackerwin7/article/details/17585257 和https://www.cnblogs.com/yangjiannr/p/da-shu-ju-chu-libitmap.html一、bitmap算法思想 32位机器上,一个整形,比如int a; 在内存中占32bit位,可以用对应的32bit位对应十进制的0-3...转载 2018-08-23 10:26:36 · 2703 阅读 · 0 评论 -
并查集
并查集(Union Find),又称不相交集合(Disjiont Set),它应用于N个元素的集合求并与查询问题,在该应用场景中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。面对极大数据量时,并查集是解决该种问题的很优秀的。简单实现:#include<vector>class DisjoinS...原创 2018-07-03 22:09:00 · 128 阅读 · 0 评论 -
堆
用完全二叉树来表示特性:1.结构性,用数组表示的完全二叉树。2.有序性,任一结点的关键字是其子树所有结点的最大值(或最小值) #include<iostream>using namespace std;typedef struct heap *maxheap;struct heap{ int *elements; int size;//堆的当前元素个数 in...原创 2018-07-16 17:24:25 · 132 阅读 · 0 评论 -
中序遍历
利用栈对一个结点,1.如果左孩子不为空,则入栈,然后访问它左孩子,重复这个过程。2.如果左孩子为空了,取栈顶元素,并pop,访问它的右孩子,将右孩子作为当前结点,进行1的操作。3.直到结点为空且栈为空class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vect...原创 2018-05-22 19:36:25 · 4908 阅读 · 0 评论 -
前序遍历
利用栈,注意入栈顺序是先right再leftclass Solution {public: vector<int> postorderTraversal(TreeNode *root) { vector<int> res; if(root == nullptr) return res; ...原创 2018-05-22 19:51:56 · 376 阅读 · 0 评论 -
后序遍历
类似前序遍历,不过入栈时是先left再right,得到根右左,再对结果反转得到左右根class Solution {public: vector<int> postorderTraversal(TreeNode *root) { vector<int> res; if(root == nullptr) ret...原创 2018-05-22 19:54:46 · 543 阅读 · 0 评论 -
KMP算法
//概念: 前缀 后缀//文本T a b c a b a a b c a b// | | | |//模式P a b a a //KMP算法考虑T的每一个前缀的每一个后缀和P的前缀匹配对于模式P,1.写出要搜索的字符串它的prefix table//例如,a b a b c//5个前缀//a//a b//a b a//a b...原创 2018-05-27 21:33:16 · 222 阅读 · 0 评论 -
合法的出栈序列
已知从 1至n 的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?模拟入栈过程,为了测试出栈序列是否正确,将元素按顺序入栈进行模拟。如果能够利用栈模拟出出栈次序,说明序列正确使用栈和队列模拟入栈,出栈过程将序列存在队列中,将元素按顺序入栈,如果和队列首部元素相等,则弹出队列和栈,直到栈为空,不为空的话,说明序列不...原创 2018-06-12 22:52:59 · 1316 阅读 · 0 评论 -
二叉查找树的插入
#include<iostream>#include<vector>using namespace std;struct TreeNode{ int val; TreeNode* left, *right; TreeNode(int x) :val(x), left(NULL), right(NULL){}};void BST_insert(TreeNo...原创 2018-06-20 19:30:09 · 241 阅读 · 0 评论 -
拉链法解决哈希表冲突
#include<iostream>#include<vector>using namespace std;struct ListNode{ int val; ListNode* next; ListNode(int x) :val(x), next(NULL){}};int hash_func(int key, int table_len){ r...原创 2018-06-21 21:12:23 · 1376 阅读 · 0 评论 -
归并排序
#include<iostream>#include<vector>using namespace std;void merge_sort(vector<int>& vec1, vector<int>& vec2, vector<int>& res){ int i = 0; int j = 0; w...原创 2018-06-01 09:56:23 · 77 阅读 · 0 评论 -
排序(冒泡,插入,希尔,归并,快排,选择,堆排序,桶排序,基数排序,鸡尾酒排序)
稳定的排序 时间复杂度 空间复杂度 冒泡排序 最差、平均O(n^2),最好O(N) 1 鸡尾酒排序(双向冒泡排序) 最差、平均O(n^2),最好O(N) 1 插入排序 最差、平均O(n^2),最好O(N) 1 归并排序 最差、平均、最好O(nlogn) n 桶排序 n k 基数排序 dn n...原创 2018-07-16 11:39:38 · 6670 阅读 · 1 评论 -
Trie树
trie树,又称字典树或前缀树,是一种有序的,用于统计、排序和存储字符串的数据结构,它与二叉查找树不同,关键字不是直接保存在结点中,而是由结点在树中的位置决定。一个结点的所有子孙都有相同的前缀,也就是这个结点对应的字符串,而根结点对应空字符串。一般情况下,不是所有的结点都有对应的值,只有叶子节点和部分内部结点所对应的键才有相关的值。trie树的最大优点就是利用字符串的公共前缀来减少存储空间和查询时...原创 2018-07-03 16:22:52 · 117 阅读 · 0 评论 -
括号匹配
比如’(‘和’)’,前者可称为左侧符号,后者可称为右侧符号。在做符号匹配时,如果以左侧符号为标准,左侧符号需要右侧符号来完成匹配,但是由于诸如括号这类的符号可以做嵌套,所以左侧符号之后既能有左侧符号,也能有右侧符号,处理起来很麻烦。以右侧符号为标准就没有这个问题了,每一个右侧符号都需要一个左侧符号来匹配,并且要求该右侧符号之前最近的一个符号必须是相匹配的左侧符号。 利用栈可以很容易地解决...原创 2018-09-15 10:57:45 · 200 阅读 · 0 评论