![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 57
SZL-C
潜力股
展开
-
C++版的顺序表:vector
vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。为了能更好的了解和掌握vector,我们今天来模拟一下vector接下来就是函数的实现部分了:#原创 2017-03-12 15:03:25 · 643 阅读 · 0 评论 -
迷宫
迷宫程序原创 2017-04-25 19:46:45 · 298 阅读 · 0 评论 -
二叉树的创建和遍历
先序:根结点——>左子树——>右子树(递归、非递归)中序:左子树——>根结点——>右子树(递归、非递归)后序:左子树——>右子树——>根结点(递归、非递归)层序:从根结点开始,按照从上到下,从左到右的顺序原创 2017-05-09 23:11:10 · 888 阅读 · 0 评论 -
求一个二叉树中两个结点的最大距离
首先说一下距离这个词,在二叉树中距离就是从一个节点到另一个结点的边的条数,为了更为清晰的描述这个概念,下面来看一张图:看上面的图,蓝色线表示的是结点4到6的距离,红色线表示的是从结点5到6的距离,从图中我们可以看到,不是所有的距离都经过根结点的,这一点很重要。那么怎么求最远距离呢?上面的那个图中,我们可以很容易看出最远的距离就是从4到6,或者是从4到5,都是一样的。而且我们还发现,他们分别是左子树的原创 2017-05-19 17:30:14 · 3044 阅读 · 0 评论 -
二叉搜索树(二叉排序树)
二叉搜索树:又称二叉排序树,他有三个特点:1、若它的左子树不为空,那么它的左子树中所有节点的值都小于根结点的值2、若它的右子树不为空,那么它的右子树的所有节点的值都大于根结点的值3、它的左右子树也是二叉搜索树那么现在我们就来给出一个二叉搜索树,我们来观察一下,看看能发现什么。 首先我们可以根据他的性质可以分析出,最左边的结点是最小的,而最右边的结点是最大的,这样就给出了一个球最小结点和最大结点的方原创 2017-05-21 23:47:58 · 941 阅读 · 0 评论 -
B树的实现
二叉搜索树我们已经了解了很多种形式了,有AVLTree、红黑树等,不过,这都是在二叉搜索树的基础上加了些东西(平衡因子、颜色),其本质还是二叉搜索树。现在我们遇到一个问题:要是要查找的数据量很大的时候,还用这个,那么树的深度将会很深,那么要怎么解决呢?要保证数据量不变的情况下,将树的深度降低。这就是B树了,今天我们就来了解一下B树的原理,以及实现过程。B-树的定义(数据结构书上就是这么写的,不要读作原创 2017-06-10 15:24:45 · 425 阅读 · 0 评论 -
红黑树的实现 以及加迭代器
在说红黑树之前,我们先来认识一下它:首先强调一点:红黑树也是二叉搜索树。那么它就满足二叉搜索树的性质,除此之外,他还有几个比较特殊的性质,了解这些,有助于我们后面的分析性质:1、红黑树所有的节点都有颜色(红或黑)2、红黑树的根结点是黑色的3、红黑树的两个红色节点不能相连4、红黑树的每一条链的黑节点的个数相同5、所有空的节点都是黑色的知道了这些之后开始进入红黑树的创建:显然这就是红黑树的插入操作的编写原创 2017-06-03 19:20:54 · 1327 阅读 · 1 评论 -
模拟实现 stack和queue
线性表是最基本、最简单、也是最常用的一种数据结构。之前我已经写了几次线性表了,分别是顺序表和链表,这两个以各种形式实现了多次,那么今天我么就再来看两种线性表,两种特殊的线性表——栈和队列栈(stack)首先说一下栈的概念:栈又叫后进先出的线性表(LIFO),不明白?那就再看一下它的结构吧,栈是只在一端进行插入和删除操作的,这也是它的特殊之处,这一段就是栈顶(top)。既然栈是线性表,那么肯定有顺序栈原创 2017-04-20 22:56:25 · 1091 阅读 · 0 评论 -
哈希表
数据结构我们了解好几个了,其中写的最多的就是顺序表和链表,在这个阶段,还模拟实现了库中的vector和list,随后我们又了解了队列和栈这些都是线性的数据结构,所以想要查找一个元素的话,这些的时间复杂度都是O(N)。除了线性结构还有树形结构,在这里我们从二叉树开始,先后了解了二叉树的实现以及线索化,不过我们发现一个问题,那就是如果二叉树写成单支的情况,那就是线性结构了,所以我们又了解了平衡二叉树、红原创 2017-07-03 08:16:48 · 295 阅读 · 0 评论 -
关于二叉树的一些题
二叉树的创建我们已经了解了,现在我们在这一个基础上来拓展一些常出现的题1、在二叉树中寻找一个节点——>存在,返回节点,不存在返回NULL2、求一个节点的双亲节点——>存在,返回节点,不存在返回NULL3、求二叉树的高度4、求叶子节点的个数5、求第K层的节点个数6、求一个二叉树的镜像……不过在这这钱我们先来补充一下二叉树的性质:1、若规定根节点的层次为0,南无一个非空的二叉树的第i个节点最多有2^i(原创 2017-05-16 20:32:40 · 1388 阅读 · 0 评论 -
AVL树(旋转问题详解)
二叉搜索树给我们了一个搜索一个点的方法,同时,也将二叉树中的节点排序了,但是,对于一些特殊的二叉树来说,使用二叉搜索树会很费空间,比如说:左单支的这种情况,你说是二叉树,还不如说是单链表呢,还节省了一大波的空间呢(右指针域),同样的,对于右单支的情况也是如此,那么现在我们就要想能不能避免这个问题。可以,一个平衡因子就可以搞定,加了平衡因子,那么这颗二叉搜索树就是AVLTree了那么现在我们就来分析一原创 2017-05-26 16:14:39 · 1696 阅读 · 0 评论 -
稀疏矩阵的压缩存储和快速逆置
稀疏矩阵啊,就是矩阵中的有效元素很稀疏,稀疏到什么程度呢?通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵(sparse matrix)。我们想,一少部分的有效元素就占用大部分的地址空间,是不是很浪费,那么我们就要想办法让其不浪费那么多,就是压缩存储。之前我们写过对称矩阵的压缩,那是因为对称矩阵的分布很有规律,但是再看一眼稀疏矩阵,除了有效元素少一点,也没原创 2017-05-07 23:48:59 · 747 阅读 · 0 评论 -
单链表 (面试题)
关于单链表的基本操作,之前已经总结过了,那些掌握之后算是了解了单链表是什么?不过现在面试的题中,肯定不会只让你回答单链表的基础操作,总是会改变一些东西,或是扩展一下。下面就是一些关于单链表的扩展内容:#include<stdio.h>#include<stdlib.h>#include<assert.h>#pragma warning (disable:4996)#define DataTy原创 2017-02-23 16:48:27 · 515 阅读 · 0 评论 -
单链表的基本操作
关于单链表,我写了很久,查了很多资料,主要的原因还是以前的知识不是太牢固,所以写的时候错误很多,不过大都能调试出来。或许是一个寒假没咋敲代码了,最普遍的一个错误:判断两个数是否相等的时候,正确的语句是:int a=10;int b=20;if(a==b)//这里是双等号{语句}两个等号,我老是写成一个,这个以前纠正过,过了一个寒假,又犯错了。还有就是涉及传参的问题,这个搞得最久,其中的大部原创 2017-02-15 11:17:30 · 368 阅读 · 0 评论 -
静态顺序表和动态顺序表 对比
静态顺序表的缺陷:静态顺序表显然就是里面的内存是一定的,不能改变的,所以定义的时候可以定义一个宏,然后定义一个数组,这样就可以在数组中存储信息,而且,还可以随时改变数组的大小。typedef int DataType;#define MaxSize 10typedef struct SeqList{ DataType array[MaxSize]; size_t size;原创 2016-12-30 23:13:45 · 1624 阅读 · 0 评论 -
C语言实现顺序表
头文件部分:#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int DataType;#define MaxSize 10typedef struct SeqList{ DataType array[MaxSize]; int size; // 有效数据元素的个数}SeqList;//打印顺序表原创 2016-12-25 15:06:16 · 850 阅读 · 0 评论 -
单链表面试题~带环链表的入口点
昨天做了一个小总结,发现单链表这块关于带环链表漏掉了,今天就来总结一下。要寻找一个单链表的环的入口点,首先得判断一个链表是否带环,那么又怎样判断一个单链表是否带环呢?首先我们得普及一下环有什么特性,我们知道无环的单链表有首节点和尾节点,那么带环的单链表呢?显然还是有首节点的,但是没有尾节点吧。如图所示: 带环的单链表既然没有尾结点,那么要是遍历的话,就会无限循环,我们就没法通过这样来判断这是带环的原创 2017-03-19 13:27:30 · 693 阅读 · 0 评论 -
模拟实现 list
链表前面我已经写过了,不过写的是单链表,而C++库中的list是双链表,那么,我们就来模拟实现一下双链表,这样对于库中的list也会有更加深刻的了解。那么首先我们先来了解一下双链表的结构,双链表无非就是比单链表多了一条链,单链表只有一条指向下一个节点的链,而双链表会多一条指向前一个节点的链。说白了就是多了一个指针罢了。而具体的函数功能还是那些,那么我们就来实现这个链表吧!#include<iostr原创 2017-04-15 23:31:29 · 410 阅读 · 0 评论 -
中缀表达式转化为后缀表达式、后缀表达式求解(栈)
计算器我们都实现了很多了,但是,我们写的计算器都是求解两个操作数的,并不能求解一个表达式,如今栈已经学完了,那么我们可不可以使用栈来实现表达式的求解呢?我们数学上求解一个表达式是如何进行的,有括号的先求括号内部的,之后先算乘除,再算加减。现在如果来实现一个这样可以求解表达式的计算器,怎样进行呢?首先是将中缀表达式转化为后缀表达式,具体的规则如下:1、遇到操作数,直接输出; 2、栈为空时,遇到运算原创 2017-05-02 17:48:40 · 521 阅读 · 0 评论 -
对称矩阵的压缩存储
矩阵对于学数学的都不陌生,说白了就是一个二维数组嘛,不过矩阵里有一些很有特色的矩阵,今天我们就来看一种——对称矩阵。下面来看一个对称矩阵,顺便分析一下,对称矩阵的性质,以便我们随后的研究。我们看,中间红线标出的就是对称线,既然是对称,那么首先这个矩阵得是方阵,也就是说,行数和列数相等;整个矩阵分为两部分,上三角和下三角,在上三角行号小于列号,而在下三角行号大于列号;最后就是对称表现出来的性质了:a[原创 2017-05-05 17:23:51 · 1555 阅读 · 0 评论 -
【牛客】二叉搜索树与双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路: 1、树为空,直接返回 2、树只有一个节点,将其根节点返回 3、定义一个指针pre指向访问过的节点,然后使用递归的思想实现 4.递归左子树,找到最左边节点 5.将当前节点的左指针指向pre,如果pre不为空,将pre的右指针指向当前节点 6.递归右子树原创 2017-08-26 23:06:15 · 302 阅读 · 0 评论