自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 二叉树:修剪二叉搜索树

然后对0的右子树进行递归检查,目的是检查0的右子树中的结点是否都是在[1, 4]范围内的,如果,0的右子树都是在[1, 4]内的,说明我们可以直接用0的右子树来代替0,修剪就完成了。首先,对于0这个结点,是小于[1, 4]的low的,所以,如果0这个结点被删除了,就不是一个合格的二叉搜索树了。同样的道理,如果不是这个树,是别的树,对这个树的每一个结点/子树都可以做如下判断。这里删除的是这棵树[1, 4]以外的结点,如图,要删除的就是0和4这两个结点。修剪二叉树的意思就是,将不在给定范围内的结点删除,

2023-02-06 20:57:24 607 1

原创 二叉树:删除二叉搜索树中的节点

然后开始从最底下一层往上传值,下面一层返回的值,其实是上面一个层函数的组成部分,同样,上面一层函数返回的值又是上上面一层函数的组成部分。那按照同样的思路,最底下一层调用递归函数传入的参数会是2这个结点的左子树,也就是。到这里就讲解完毕了,如果还是不明白,结合思路,代码,将这个例子自己理一遍思路。我们在组织代码的时候,脑子里要有向下寻找的过程,更要有一层一层向上回溯的过程。对于1,没找到,说明树不会被修改,将原来的树原封不动返回。对于2,找到了,肯定返回的是最终删除了指定元素的树。

2023-02-02 16:25:44 1874

原创 二叉树:二叉树的最近公共祖先

刚看到这个题,肯定会有点懵,我开始也很懵,根本不知道从何下手,没关系,只需要先将这个思路理解了,先将这个方法掌握啦,掌握的方法多了,慢慢就有了自己的思路了。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(比如上面的例子,最后返回的是3,这个3是我们在检查完5和1后,发现5和1满足条件才认定3是最终结果的。无论在这个树的哪个位置找到了p或者q都要能把p,q返回到上一层,方便上层结点做判断。

2023-02-01 11:24:02 430

原创 二叉树:验证二叉搜索树

通俗理解,对于每一个结点,这个结点的左孩子小于中间结点,中间结点小于右孩子。比如下面这个树,如果对这个树进行中序遍历【左->中->右】就会得到如下序列可以发现,对于二叉搜索树,如果我们用中序遍历,最终得到的是一个递增序列。那反之,如果我们要验证一棵树是不是二叉搜索树,只需要对其进项中序遍历,每遍历到一个结点,就和上一个遍历的结点比大小,如果对于树中每一个结点,都满足当前遍历的结点能大于上一个遍历到的结点,那么这个树就是二叉搜索树。

2023-01-31 12:57:14 200

原创 【C++语法难点】 深拷贝和浅拷贝是什么,拷贝构造,拷贝赋值

深入说明深拷贝和浅拷贝,C++类和对象入坑必学!!!

2022-11-19 10:54:01 718

原创 C++引用知识点超级清楚的总结

希望入门的C++的小伙伴,能通过这篇文章,更好理解引用知识点。

2022-11-12 16:51:36 1002

原创 STL链表容器:自制list(链表)容器

自制STL链表容器。

2022-11-06 19:26:38 787

原创 c++范围for循环

c++范围for循环

2022-10-29 10:13:47 249

原创 c++向一个vector中连续写入与输出数据

向vector中连续写入,读出数据

2022-10-29 09:49:35 1183

原创 STL库-类模板知识点总结

类模板库知识点总结。

2022-10-26 18:33:08 378

原创 STL库-函数模板知识总结

c++函数模板知识点总结,关于函数模板,要的都在这里。

2022-10-25 11:47:12 418

原创 c/c++指针:指针函数和函数指针

c/c++指针系列之【指针与函数】,详细说明了两部分内容:返回值是指针的函数,函数指针。

2022-10-23 12:41:06 603

原创 const和指针

指针与const关键字;指向常量的指针;常量指针;这篇短文介绍清楚了!!!!

2022-10-14 13:39:36 270

原创 C语言基础指针知识点总结

C语言指针知识点总结,入门级指针,全面总结,这一篇足够了

2022-03-23 20:32:08 8569 3

原创 C语言易错知识点总结

1.c语言中%d, %o, %f, %e, %x的意义%d整型输出,%ld长整型输出%o以八进制数形式输出整数%x以十六进制数形式输出整数%f用来输出实数,以小数形式输出%e以指数形式输出实数2.C语言中的八进制在写代码的时候,八进制数字前面必须加上0printf函数输出八进制的时候,前面是没有0的转义字符反斜线后的八进制数字前面不用加0eg: ‘\101’ 代表字符 代表字符 ‘A’转义字符多用于printf中,scanf中不常用3.赋值运算符=a =

2022-03-20 22:08:16 3011

原创 排序2:简单选择排序

一、思路和代码实现在内部排序的选择排序中简单选择排序是选择排序的基础。也方便后面堆排序的理解。选择排序,顾名思义,就是从一些数据中每次都选出这些数据最大或者最小的值。如果我们想从小大排列,那就每次把数据中最小的数挑出来,挑到最后一个那就是最大的了。同理,如果我们想从大到小排列 ,每次把最大的元素挑出来就行。挑出来的元素,一个一个按顺序放在数组里就是一个递增或者递减的有序序列了。//使用简单选择排序,将线性表排成由小到大的顺序void SelectSort(int A[], int n){

2021-12-14 17:26:01 523

原创 二叉树5:输出第h层元素

以层序遍历为基础:层序遍历首先,给树的结点加上layer这个成员。layer用来记录每个结点所在的层号。当用层序遍历访问根节点的时候,首先先将根节点的layer设置为1。然后,后序每一个孩子进入队列的时候。都让child->layer = 父->layer+1。也就是让孩子的层数为父节点层数+1。然后,在每一次出队的时候,对每个元素进行如下操作:检查每个结点的layer看是不是我们要输出的第h层。如果是就输出。over,上代码:typedef struct BiNode

2021-12-14 16:18:12 730

原创 图4:判断无向图是不是一棵树

一、 思路图满足什么样的条件可以将其称为树呢?树其实是一种特殊的图。树的特点就是,有n结点,有n-1条边。并且联通。所以,当我们对一个图进行遍历,使用一次深度优先遍历算法(DFS)。如果边数为n-1结点数为n那么,就说明这个图可以称之为一棵树。二、代码实现bool visited[MaxVertexNum];int vex_num;//全局变量,用来统计一轮深度遍历访问的顶点个数int arc_num;//全局变量,用来统计一轮深度遍历访问的边数void DFSTraverse

2021-12-10 18:30:27 814

原创 图3:深度优先遍历

一、思路图的深度优先和树的先根遍历很类似。具体流程如下:先访问图中的一个顶点v然后访问与v有关的第一条为被访问过的顶点w再访问与w有关的第一条未被访问的顶点w1…然后,就到了最后一个顶点了,这个顶点没有与之有关且没有被访问过的顶点了退回到上一个顶点,访问上一个顶点的第二条未被访问的顶点(如果没有继续退回上一层)…然后就访问完了。和树的先序递归遍历不能说一模一样,总之是非常非常类似了。所以,这也使用递归的方式进行遍历。注意:和图的层序遍历类似,因为图中可能出现回路,而且无向图中结

2021-12-10 17:58:10 737

原创 二叉树4:二叉树求树高度(超级详细)

一、思路什么是树高?树的高度(或深度)就是树中结点的最大层数。在这里二、代码实现typedef struct TreeNode{ int data;//数据域 TreeNode *RChild;//右孩子指针 TreeNode *LChild;//左孩子指针}TreeNode, *BiTree;int PostTreeHeight(BiTree *T){ //通过后序遍历实现求树的高度 int h = 0, hl = 0, hr = 0; if (T==NULL){ retu

2021-12-10 16:48:39 39842 16

原创 栈和队列7:循环队列顺序存储结构

#define MaxSize 50typedef struct{ int data[MaxSize];//队列的数据域,存放队列元素 int front, rear;//定义队头指针和队尾指针}SqQueue;//1.队列初始化void InitQueue(SqQueue &Q){ Q.rear=Q.front=0; //初始化队首对尾指针,开始大家都指向第一个位置}//2.判断队空bool isEmpty(SqQueue Q){ if (Q.front == Q.re

2021-12-07 14:49:14 888

原创 图2:广度优先遍历

图的广度优先遍历和树的层序遍历逻辑是基本一致的,但是有一个很关键的区别:图中可能存在环,所以,我们要对每个顶点做一个访问标记,如果这个顶点被访问过了,下次就直接忽略。如果没有标记的话,若出现环,则会一直循环访问环,形成死循环解释两个函数FirstNeighbor(F, x);//求图中顶点x的第一个邻接点,若有则返回顶点号//若x没有邻接点或图中不存在x,则返回-1NextNeighbor(G, x, y);//假设y是x的一个邻接点,返回除了y以为顶点x的下一个邻接点的顶点号//若y

2021-12-06 15:39:09 703

原创 图1:图的存储

一、邻接矩阵若图为不带权值的图:则边值为0或者1,可以让边表的数据类型为bool类型的数组若图为带权值的图:则边值为一个数字或者∞。∞代表这两点之间没有边;数字则代表若这两个点右边时边的权值。总之,在邻接矩阵中若某个边的值为0或者∞则代表:在邻接矩阵中与这个位置相关的两个定点之间没有边。空间复杂度O(n^2)#define MaxVertexNum 100//定点数目的最大值#define INT_MAX//INT类型数据的最大值,可用其表示∞typedef struct{

2021-12-06 14:27:30 202

原创 顺序表2:顺序表的逆置

一、顺序表逆置基本逻辑和实现1.顺序表逆置的逻辑将顺序表丛中间一分为二。如果这个顺序表元素个数为i;让第一个元素和最后一个元素互换,第二个和倒数第二个元素互换;…第i/2个元素和第i/2+1个元素互换。交换结束以后,这就是个逆序的表了。2.代码实现void Reverse(Sqlist &L) { int temp;//辅助变量 //这里L.Length/2会自动保留整数部分,所以,如果是奇数就没有任何影响了 for (i = 0; i < L.Length/2; i

2021-12-03 17:27:45 8143

原创 链表练习题C++代码实现(四):将两个递增的链表合并为一个顺序递减的链表

考察知识点:头插法和尾插法的区别。两个有序链表的合并。

2021-12-02 16:13:30 987

原创 排序1:直接插入排序

直接插入排序原理很简单前提:一个随机序列。思路:从第二个元素开始,每个等待插入元素都要和前面的元素比较。比较的结果分为两种①若这个元素大于其前一个元素: 则位置保持不变。②这个元素小于前一个元素: 则继续往前找其前前一个元素。同时要比较该元素和前前个元素的大小。同样,如果大于则插入在其前前一个元素的后面。若小于,则继续往前找。直到 找到一个比带插入元素小的,然后插入到哪个元素后面。然后接着对将后一个元素作为待插入元素,和前面的元素进行比较,直到遍历完这个列表。注意:若这个表

2021-11-28 15:26:14 114

原创 二叉树6:二叉树的层序遍历

1.先看下面这张图层序遍历怎么工作的呢?从左到右,丛上到下,依次遍历。就和我们平时阅读的顺序是一样的。第一行看完了,看第二行。所以很明显,下面这个树的层序遍历序列是:1,2,3,4,5,6,7,8,92.数据结构实现的逻辑我们需要一个队列,具体流程如下图:3.c++完整代码(超级详细的注释)#include <vector>#include <queue>using namespace std;class Solution{public:

2021-11-17 17:55:13 891

原创 二叉树2:迭代(栈)实现二叉树的先序遍历

二叉树1:递归实现二叉树的先序、中序、后序遍历中给出了用递归的方式实现二叉树遍历的流程,这个文章总结一下【用迭代的方法实现二叉树的先序遍历】。迭代的关键就是用栈这里先模拟一下如何使用栈来遍历这个二叉树。我们需要一个栈:st。一个列表:vec。列表用来保存最后遍历的结果,也就是最终先序遍历的顺序。先序遍历的是中左右,总体思路是这样的:step1:访问到的这个结点,先进栈;step2:立马将其值放入vec列表中(按顺序),并让这个结点出栈;step4:接着 先 访问其右子树(不为空的话

2021-11-14 16:30:33 2230

原创 二叉树1:递归实现二叉树的先序、中序、后序遍历

先序,中序,后序遍历有什么区别?1.序是什么?(一)、我们知道,二叉树每个结点最多有两个孩子,一个左孩子一个又孩子。访问的时候,这个序就指的是:父节点,左孩子,右孩子。他们三个的访问顺序。(二)、再一个,访问左右子树的相对顺序是固定的,即无论先序,中序还是后序,对于左右子树都是 先访问左子树,再访问右子树。不存在先访问右再访问左这一说。(三)、有了(二)的约束以后,那其实先序、中序、后序的访问顺序就很明显了,其实就是父节点相对于左右子树或左右孩子的访问顺序先序遍历:访问中间结点,再访问左

2021-11-13 16:53:45 1941

原创 哈希表1:有效的字母异位词 (详细解析)

题目描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。**注意:**若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。题目链接:有效的字母异位词解决思路找一个数组record长度为26,因为一共就26个字母嘛。首先,扫描字符串s。如果扫描到字母a,就让record[0]++。代表a出现一次。就像咱们选班长投票写正字一样。出现几次,就给那个字母记上几次。然后,扫描字符串t。这个时候,就相当于是,如果选班长的时候,

2021-11-08 15:58:43 311

原创 栈和队列6:滑动窗口最大值

入队push()的原则若push的数值大于入口(队尾)的元素值,那么就直接将队列后端(队尾)的数值弹出。如果一直大于,就一直弹对尾元素;直到要push的数值比对尾元素的值小。(一个是最大的,一个是次大的)出队pop()的原则每次弹出的时候,检查当前窗口要移除的元素value **(就是窗口最左边的元素)**和队列出口(队头)元素的大小,若两者相等(要弹出的元素和队头元素)那么,弹出。语言描述令人头昏脑涨,还是举个例子模拟一下吧。模拟完了再来看上面的描述。模拟:数组:num

2021-11-08 14:23:28 83

原创 栈和队列5:逆波兰表达式求值(c++代码实现)

什么是逆波兰表达式?波兰表达式就是一种后缀表达式后缀就是运算符卸载后面。我们生活中常见的是中缀表达式:比如:1+2这里 + 写在1和2之间。后缀表达式呢,会这样写:1 2 +为什么用后缀表达式(也就是逆波兰表达式?)原因很简单,逆波兰表达式是给计算机看的,逆波兰表达式更方便计算机理解。中缀表达式1+2这种的,更方便人理解,但是计算机不好理解。为啥计算机好理解逆波兰表达式,不好理解中缀表达式呢?首先我们看看逆波兰表达式是怎么工作的。比如现在有这么一个中缀式(1+2)*3-

2021-11-07 08:57:38 826

原创 栈和队列4:删除字符串中相邻的相同元素

思路思路很类似下面这个问题:栈和队列5:用栈检测括号是否匹配删除字符串更简单一些,很像我们玩的“消消乐”。具体思路在代码注释,也可以结合上面的括号检测一起理解。#include <iostream>#include <stack>#include <algorithm>using namespace std;class Solution {public: string removeDuplicates(string s) {

2021-11-06 15:27:36 300

原创 栈和队列3:用栈检测括号是否匹配

比如有"({{()}})"这样一个字符串,我们现在要判断它括号是否能正常匹配。入栈顺序为’(’,’{’,’{’,’(’。我们实际入栈的时候,会遵循这样的原则:如果检测到时’(‘就让’)‘入栈,如果是’{‘就让’}‘入栈,如果是’[‘就让’]'入栈为什么这样做呢?为什么不检测到 ‘(’ 就让 ‘(’ 入栈呢?比如: 现在扫描到了第二个 ’(' 了,那么下一个就应该扫描 ’)' 了。若入栈的是 ’)' 就可以直接判断二者是否相等。看见栈里面的’)‘其实就是看见了’(’。若相等就直接Pop就就行了

2021-11-06 11:00:56 421

原创 栈和队列2:用队列实现栈

使用一个队列来模拟栈,难点在pop()函数。栈要首先弹出最后进入的元素。所以,我们可以把队列对尾元素前面的元素,依次重新入队。这个时候,原来的对尾就成了队头了。在使用pop(),这时候弹出的就是最后插入的元素,即栈顶元素了。#include <queue>#include <iostream>using namespace std;class MyStack {public: MyStack() { } //新建一个队列,用这个队列来实

2021-11-05 14:07:50 76

原创 栈和队列1:用栈模拟队列

解题思路核心就是要建立两个栈,一个输入栈一个输出栈。输入的时候:先让数据进入输入栈,这时候栈顶元素就是最后进入栈的元素。输出的时候:先让输入栈的元素push( )到输出栈。这时候:输入栈的栈顶就成了输出栈的栈底;输入栈的栈底就成了输出栈的栈顶。刚好输入栈的栈底就是第一个输入的元素,此时,他在输出队列中是栈顶。所以也会第一个输出他。这样就达到了:先入先出。队列的作用了。#include <iostream>#include <stack>using nam

2021-11-05 11:31:36 107

原创 链表练习题c++代码实现(四):经典问题,链表翻转

问题: 就地逆置链表[空间复杂度为O(1)]思路:其实很简单,只要把链表中的->全都变成<-就行了然后再给最后一个结点整个表头就搞定了。问题是怎么把->变成<-直接上代码typedef struct ListNode { int data;//数据域 ListNode *next;//指针域}ListNode, *LinkList;注意ListNode和*LinkList的区别ListNode a;//代表顶一个一个ListNode数据类型的变量,名字叫a

2021-11-04 12:05:48 483

原创 链表练习题c++代码实现(三):删除链表的倒数第n个结点

2021-11-04 11:39:48 619

原创 链表练习题c++代码实现(二):寻找两条单链表的公共结点

寻找条链表的公共结点若两条链表有公共结点,则这两条链表和公共结点的样子应该是Y形状的两条链表可能不等长,所以长链表要先进行遍历,等遍历到剩余结点和短链表一样时再共同往后走,进行比较本代码所建立的链表都是带头结点的,采用面向对象实现lscc.h文件对方法的声明在这个文件里,具体实现在lscc.cpp文件后文有/* *文件名:lscc.h *作 者:辛伯达 *描 述:寻找两条单链表的公共结点 * */#ifndef LSCC_H#define LSCC_H#include

2021-11-02 15:59:01 549

原创 链表练习题c++代码实现(一):头插法,尾插法,删除指定结点

lscc.h文件头插法和尾插法都代码实现都有。采用面向对象的方法实现,第一个文件是.h文件,是对方法的初步定义,具体实现在lscc.cpp文件里(往下滑就能看见啦)。/* *文件名:lscc.h *作 者:辛伯达 *描 述:链表的基本操作和4个习题 */#ifndef LSCC_H#define LSCC_H#include <iostream>using namespace std;//定义链表中的数据结点typedef struct ListNode{

2021-10-31 21:20:43 622 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除