![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 79
简单的数据内容,有概念,也有刷题的解析
Rea0916
你受的苦终将照亮夜行的路
展开
-
【LeetCode题解】 ——用O(nlogn)的时间复杂度对链表排序(归并排序)
常数级时间复杂度对链表排序(为什么写这个题呢?因为恰好我们可以复习下排序算法的时间复杂度),题中要求时间复杂度为O(nlogn),显然从下表可以看出来归并排序和堆排是可以实现的,这里我采用归并排序的方法说一下思路。思路:我们先利用快慢指针的方法,找出链表的中间节点,然后对左右两个部分分别做同样的操作,直到剩下一个元素,那元素就是有序的。最后再将有序的数组归并。我这里解释一下这段代码:这个是将两个链表归并起来意思(只是完整代码的一部分),比如list1=1->4; list2=3,我们顺着原创 2020-05-19 13:34:50 · 507 阅读 · 0 评论 -
【牛客题解】 ——二叉树的下一个节点
二叉树的下一个节点题中给出的指向父亲节点的指针,用next表示,有点会让人误解。思路:我们以以下这棵二叉树为例,中序遍历为{D,B,H,E,I,A,F,C,G}把很容易可以发现,如果要找一个节点的下一结点,比如说是B节点的下一结点,我们首先看B的右树是不是为空,如果不为空,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点,在这里B的下一个节点是H;无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 H,下一结点是 E无右子树,且结点是该结点父结点的右子树,则我们一直原创 2020-05-16 22:06:30 · 269 阅读 · 0 评论 -
【牛客题解】 ——序列化二叉树
序列化二叉树(能看懂这个题的都是大佬…我太菜了…)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/cla...原创 2020-04-26 14:34:18 · 208 阅读 · 0 评论 -
【C++】——快速排序(前后指针,挖坑法,快慢指针法)
一、前后指针法基本思路:1.将数组的最后一个数right作为基准数key。2.分区过程:从数组的首元素begin开始向后找比key大的数(begin找大);end开始向前找比key小的数(end找小);找到后然后两者交换(swap),知道begin >= end终止遍历。最后将begin和最后一个数交换( 这个时候end不是最后一个位置),即 key作为中间数(左区间都是比key小的数...原创 2020-04-26 00:32:15 · 1368 阅读 · 1 评论 -
【牛客题解】 ——之字形打印二叉树
之字形打印二叉树(我以为跟此次遍历二叉树一样那么简单,发现人家这个题貌似比层次遍历高一个level)思路:利用队列,队列中出一个元素,就把它的左右孩子带进去,不过先开始得设置一个标志位为false,表示他不是从左往右打印的,每一个层次遍历完,都改变falg的值,falg为false,那就翻转/*struct TreeNode { int val; struct TreeN...原创 2020-04-22 22:17:10 · 153 阅读 · 0 评论 -
【牛客题解】 ——判断一棵树是否为对称二叉树
判断一棵树是否为对称二叉树(对不起,我第一次做这个题的时候,写的太复杂了…不断的调用函数)思路一:先找出这个二叉树的镜像,再判断两个二叉树是否为同一个二叉树,但是这又涉及到一个问题,你得先把原来的二叉树保留下来,才能传到求镜像的函数,不然原来的树就改变了,所以要用另一个拷贝函数。/*struct TreeNode { int val; struct TreeNode *l...原创 2020-04-22 13:40:54 · 248 阅读 · 0 评论 -
【数据结构】 ——删除链表中的重复节点(不保留重复节点)
删除链表中的重复节点(不保留重复节点)(剑指offer上面对这个题难度是4(总共五颗星),我寻思着,是我最近进步了?我觉得没那么难吧)说下我的思路:利用map存储链表节点的值和次数,遍历map,当map元素次数为1的时候,开辟一个新结点,将次数为1的值存储起来,挂到新链表中,最后返回新链表的头。这里要注意的是为了防止第一个和第二个就是重复节点,例如{1,1},我们在构造新链表的时候,最好加...原创 2020-04-20 19:12:26 · 409 阅读 · 0 评论 -
【C++】——C++深浅拷贝以及写时拷贝的理解(调试+代码)
深浅拷贝和写时拷贝(最近好烦哦,觉得自己状态不是很好,复习的效率也不是很高,刷个LeetCode,人家写个递归,我觉得自己得想好久,调试好久,还不一定完全理解,事情也太多了)今天上课的时候,老师说深浅拷贝这个是高频考点,行吧,看不懂递归,我来看点自己可以理解的。1、浅拷贝比如说,现在有一个对象A,需求是将 A 拷贝给对象B,当B拷贝了A的数据后,当B的改变会导致A的改变,此时叫做B浅拷贝了A...原创 2020-04-19 20:42:53 · 254 阅读 · 0 评论 -
【牛客题解】 ——圆圈中最后剩下的数
圆圈中最后剩下的数我发现我太笨了,只能用循环队列解决!!!解法一:class node { public: int num; node* next; node(int num) { this->num=num; } };class Solution {pu...原创 2020-04-19 01:03:23 · 160 阅读 · 0 评论 -
【C++】 ——指针和引用的区别、数组和链表的区别
1、指针和引用的区别都是地址的概念,指针指向的是一块内存,它的内容是内存的地址,但是引用是一块内存的别名。区别:指针是一个实体,但是引用仅仅是别名引用使用时,无需解引用(*),但是指针需要解引用引用只能在定义的时候被初始化一次,之后不可改变,但是指针可变引用没有const,但是指针有const引用不能为空,但是指针可以为空sizeof引用的时候得到的是所指向变量(对象)的大小,但...原创 2020-04-18 23:32:14 · 524 阅读 · 0 评论 -
【C++】 ——全排列算法
关于全排列算法,分为两种:可重复的全排列和不包含重复的元素的全排列一、含重复元素的全排列算法思路:(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);(2)出口:如果只有一个元素的全排列,则说明已经排完(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等待出口,出口出去后还需要还原数组#include <iostream&g...原创 2020-04-16 13:42:31 · 1409 阅读 · 2 评论 -
【牛客题解】 ——数组中只出现一次的数字
数组中只出现一次的数字思路一:利用unordered_map,先把数组中的数字和次数放入map中,再次遍历数组,如果次数为1,则记录结果class Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { unordered_map<...原创 2020-04-15 18:49:37 · 213 阅读 · 0 评论 -
【C++】 ——判断一棵树是否为平衡二叉树的两种方法
判断一棵树是否为平衡二叉树思路一:根据求树的深度的方法,依次得到每个节点左子树和右子树的高度,再次计算每个节点其左右高度差是否满足小于等于1,若都满足返回真,若不满足返回假class Solution {public: int GetDepth(TreeNode* proot) { if(proot==NULL) return 0;...原创 2020-04-15 00:47:05 · 1560 阅读 · 0 评论 -
【牛客刷题】 ——把数组排成最小的数
把数组排成最小的数思路:先把数组里面的数通过stringstream转成string类型的,再进行比较大小。最终返回一个stringclass Solution {public: static bool Compare(const string& s1,const string& s2) { string str1=s1+s2; ...原创 2020-04-13 18:30:31 · 146 阅读 · 0 评论 -
【C++】 ——红黑树的旋转(详细图解+附C++代码)
红黑树1、红黑树的概念2、红黑树的性质3、红黑树的插入(1)情况一:叔叔不存在(1)情况二:叔叔存在且为黑4、红黑树的代码实现1、红黑树的概念红黑树是一棵二叉搜索树所有的左孩子都小于根结点,右孩子都大于根结点红黑树是一棵基本平衡的树(左右高度差不超过1)红黑树最大深度小于等于最小深度的二倍2、红黑树的性质性质:(1)每个节点是红色或者黑色(2)根结点是黑色(3)所有叶节点是...原创 2020-04-13 00:42:25 · 716 阅读 · 2 评论 -
【C++】 ——红黑树C++完整代码
红黑树完整代码#pragma once#include <iostream>using namespace std;enum Colour{ BLACK, RED,};template <class T>struct RBTreeNode{ RBTreeNode<T>* _left; RBTreeNode<T>* _ri...原创 2020-04-13 00:39:25 · 255 阅读 · 0 评论 -
【C++】 ——迭代器失效的两种情况?
1、map的迭代器失效要想说迭代器失效问题,我们就得来看看迭代器为啥会失效?先来看一个题,很简单,就是删除map中可以被n整除的数字。可能第一眼我们这么写:#include <iostream>#include <stdlib.h>#include <map>using namespace std;typedef map<int,int>...原创 2020-04-09 20:14:36 · 2097 阅读 · 0 评论 -
【数据结构】——关于二叉树的刷题日记
1、判断一棵二叉树树是否为另一棵二叉树的子树class Solution{ bool IsSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { if (pRoot2 == NULL)//第二棵树遍历完,但是第一棵树没有遍历完返回真的 return true; if (pRoot1 == NULL)//第一棵树遍历完,但...原创 2020-04-01 18:45:21 · 158 阅读 · 0 评论 -
【数据结构】 ——二叉树性质以及常用接口
一、二叉树的概念在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree),二叉树常被用于实现二叉查找树和二叉堆.(摘自百度百科)1、什么是满二叉树?除了最后一层无任何子节点外,每一层上的所有节点都有两个子节点二叉树。2、什么是完全二叉树?一棵二叉树中,只有最下面两层结点的度可以...原创 2020-03-31 00:16:34 · 312 阅读 · 0 评论 -
【C++】——复杂排序希尔排序和归并排序【图解+完整代码】
1、希尔排序:以发明者Donald Shell名字命名,希尔排序是对插入排序的改进版本排序思想:首先把较大的数据集合分割成若干个小组分别进行插入排序,此时,插入排序所作用的数据量比较小,插入的效率比较高图解:例如数组:5 7 8 3 1 2 4 6(图侵删)(1)第一次算的gap=n/2=4,意思是我们把数组分成四个小组,组内数字所在下标间隔为4,如下图所示:(2)分别对这四个小组的数进...原创 2020-03-29 22:23:56 · 399 阅读 · 0 评论 -
【数据结构】 ——单链表基础题【下】
1、单链表是否回文思路1:取出单链表的结点放入栈中,再进行一一比较思路2: 找出后半部分的元素入栈,在与前半部分的元素进行出栈比较思路一:class PalindromeList {public: bool chkPalindrome(ListNode* A) { ListNode* p=A; stack<int> list...原创 2020-03-28 15:18:39 · 182 阅读 · 0 评论 -
【数据结构】——单链表基础面试题【上】
//1、单链表的逆置node* Reverse(node* s1){ Node* head = s1; Node* cur = head->next; head->_next = NULL; while (cur) { Node* prev = cur; cur = cur->_next; prev->_next = head; prev =...原创 2020-03-26 21:34:01 · 144 阅读 · 0 评论 -
【C++】 ——单链表的模拟实现(纯完整代码)
单链表我也就不多介绍了(网上的太多了),直接上实现代码,我分了三个模块,SList.h,Slist.cpp,main.cppSList.h#pragma once#include <iostream>#include <stdlib.h>#include <assert.h>using namespace std;typedef int Elemt...原创 2020-03-24 19:59:34 · 447 阅读 · 0 评论 -
【C++】 ——教你C++实现一个简单的顺序表
顺序表关于顺序表我不介绍了吧,重点记住这两句话:顺序表的逻辑结构相邻,物理结构也相邻是一组以数组形式保存的线性表后面全部都是代码了,最重要的就是代码实现了,我分成三个部分test.h,main.c,test.ctest.c:#pragma once#include <iostream>#include <stdlib.h>#include <as...原创 2020-03-24 14:25:12 · 229 阅读 · 0 评论 -
【数据结构】 ——浅谈位图以及位图原理
一、位图概念今天学校的课还挺多的,不过我也没怎么听,嘤嘤嘤,好不容易的抽出一点时间整理下位图。进入正题吧位图(bitset)是一种常见的数据结构,常用在给一个很大范围的数(比如我之前看到一个题是有四十亿个数),判断其中的数是不是在其中。这里就要用到位图,显然这么多得数在内存中是存不下的,我们就得重新想办法。位图在索引、数据压缩有很大的应用。位图使用数组实现的,数组的每一个元素的每一个二进制位都表...原创 2020-03-23 18:56:06 · 1894 阅读 · 0 评论 -
【数据结构】 --栈以及栈的应用(逆波兰表达式)
栈的定义栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底。顺序存储结构:1、元素所占的存储空间必须连续(这里的连续是指逻辑连续,而不是物理连续)2、元素在存储空间的位置是按照逻辑顺序存放的从上面可以很简明的看出栈的结构。栈的简单实现#include <iostream>#include ...原创 2020-02-24 23:30:56 · 211 阅读 · 0 评论 -
【c++】 --数组转化成二叉树
数据结构一直就很差,一直搞不清那些树的节点和数组是怎么一一对应起来的,写个博客自己整理下思路。二叉树的定义二叉树是一种非常使用的非线性结构,具有以下两个特点:非空二叉树只有一个根结点每一个节点最多有两棵子树,分别称为该节点的左子树和右子树二叉树的性质性质1:在二叉树的第k层,最多有2k-1(k>=1)个结点性质2:深度为m的二叉树最多有2m-1个结点性质3:在任意一颗二叉...原创 2020-02-22 22:50:39 · 2540 阅读 · 0 评论 -
【C++】 --AVL树的双旋
这个先贴一个之前写的博客,是关于左旋和右旋的https://blog.csdn.net/Vicky_Cr/article/details/104375075,这篇博客是对上一节的补充,在增加节点的时候,存在单旋和双旋,本篇文章主要介绍双旋AVL树的双旋双旋分为左右双旋和右左双旋左右单旋:左右双旋先左单旋,再右单旋,即就是先顺时针旋转,后逆时针旋转void RotateLR(Node* p...原创 2020-02-19 23:00:28 · 297 阅读 · 0 评论 -
【C++】 --AVL树的左旋和右旋
(时间真的如白驹过隙,快到春招了,我知道自己还差的远,心里挺惶恐的,还是大三,但我这几天每天都在坚持学习和写博客)一、AVL树的简介AVL树是最先发明的平衡二叉搜索树,在AVL中任何节点的两个子树的高度最大差别为1,因此也被称为高度平衡树。节点的平衡因子是他右子树的高度减去左子树的高度,但有时候是相反的。平衡因子可以是0,1,-1等数如上图所示这就是一个AVL树这棵树根结点为7的左子树...原创 2020-02-18 20:20:27 · 918 阅读 · 1 评论