C++
文章平均质量分 84
收录c++
孙鹏宇.
自2022-10-04开始写博客,记录于此。
展开
-
LeetCode二叉树OJ
查找二叉树中的x值求二叉树高度那里。思路:一:如果p和q都不等于空,那么就返回true,因为有可能是这样的:那万一是这种的呢?所以我们下面要设置其他条件,递归对比的时候让p的左和q的左对比,p的右和q的右对比,这样就只会出现1这种情况,不会出现2这种情况了。二:如果p和q其中只有一个为空,那么两个二叉树肯定不相同三:如果p和q的值相同,那么两个二叉树就相同运行看看:为什么结果是true呢?第一次对比相同直接把值返回了,递归就没办法往下继续对比了,剩下的节点值可能是不相同的。原创 2023-10-11 00:02:03 · 205 阅读 · 0 评论 -
单链表的增删查改
1.创建指针变量tail,让tail=head。2.tail遍历链表直到为NULL,即找到了尾节点3.创建一个新节点newnode4.让tail的next指向newnode完成连接5.把newnode给给tail,让tail跳到newnode头上。原创 2023-08-19 16:31:24 · 131 阅读 · 0 评论 -
链式二叉树
size第一次为6,第二次为12.这是因为size是static size,但是第二次却没有被置0.怎么在第二次打印的时候把size置0呢?虽然可以得到正确节点个数,但是·有缺点,就是在main函数里不能打印size,因为static是静态的局部变量。不同与之前的求节点个数是把所以节点个数累加起来,求高度是把左孩子和右孩子进行比较,谁大谁加1.思路:如果孩子都为空就返回0,如果有一个节点就返回1,然后用递归全部累加起来。这是因为size是一个局部变量,出了作用域就销毁了,每次都会从0开始。原创 2023-08-31 19:33:45 · 102 阅读 · 0 评论 -
堆的应用-Topk
假如我们要写1亿个数, 4*1000000000/1024/1024=3000多MB,也就是3G,内存就8个G,假如我们要写1百万亿个数,就要40G,内存都放不下了,只能放硬盘,放硬盘里的话就不能写堆了,因为堆需要连续紧挨着放入。我们用fsacnf读取了k个数,然后把它与fout里面剩下的一百万减五个数进行大小对比,如果小了堆里面的数就被顶替,这样小堆里的k个数就是最大的。解决办法:从N个数里面找k个最大的数,把这个k个最大的数进行topk排序。我们用这个feof来结束读取。读取k个数, 假设k为5;原创 2023-08-29 22:14:05 · 49 阅读 · 0 评论 -
C++ list
国庆放假第三天,今天把stl的list学完。lsit是一个带头双向循环链表。原创 2023-10-01 16:56:43 · 129 阅读 · 0 评论 -
C++ string
国庆补课正式开始,呜呜,室友都回家了,宿舍只剩我一个人。原创 2023-09-29 00:31:13 · 34 阅读 · 0 评论 -
C++ vector
国庆放假第二天,奥利给,继续干。原创 2023-09-30 23:11:31 · 43 阅读 · 0 评论 -
C++ 类和对象+内存管理
怎么判断调用了几次构造函数,拷贝构造函数,析构函数?定义两个全局变量m,n。每调用一次构造和拷贝构造都让m,n++,把m,n的值打印出来。很明显,main函数没有调用A这个类的话m,n的值没有++。用A对象类型创建一个变量aa1,此刻再打印出来m,n的值看:m,n的值为1,说明调用了一次构造函数。怎么看析构完还剩多少个:每调用析构一次就m--,m还剩多少就是还有多少个没有被析构。原创 2023-09-27 00:17:45 · 81 阅读 · 0 评论 -
双向循环带头链表的增删查改
这样不行,因为把指针传过去要用二级指针来接收,我们的SLTIinit类型没用二级指针。然后再写在serach后插入韩式,然后尾插函数调用。先写删除serach前的数函数,再用头删函数调用。先写在serach后插入函数,然后头插函数调用。要注意的一点就是初始化函数在调用Plist时。十分钟手撕双向带头循环链表,不用写头插尾插。先写在serach前插入函数,然后尾插调用。所以我们这里的返回值用指针接收一下,改成。SLTlist.h文件。SLTlist.c文件。原创 2023-08-21 21:22:40 · 55 阅读 · 0 评论 -
数据结构 栈和队列
我们的栈顶元素为top,但是它的起始位置在栈底,依次往上加加,每+一次就给它输入一次值,然后把这个值打印出来,最后top会走到栈顶的下一个位置而我们要出栈数据的话,就top--;第一次top--,出栈4,第二次出3,然后2,1.链式存储栈顶栈底位置与数组存储正好相反。定义结构体,STDatatype* a是数组的头部。原创 2023-09-30 19:51:34 · 60 阅读 · 0 评论 -
C++ Stack和quque
首先把写一个模版,这个模版里面我们除了放T这个类型之外还要再放个参数:Container,这个参数就是我们可以把vector,list等其他容易作为这个栈的底层,这个栈可以用其他容器的push_back,pop_back,size()等函数。平时我们的运算都是中缀运算,如1+2*3,1+2是不能先算的,因为我们不能确定后面操作符,后面操作符的优先级如果比“+”优先级大那么1+2就不能 先运算,应该先运算2*3,然后得到的结构再去+1.列如我们有一个这样的式子:((2 + 1) * 3) = 9。原创 2023-10-06 13:27:16 · 89 阅读 · 0 评论 -
C++ 类 基础篇
811A1:结构体对齐A2:成员函数实际上放在公共代码区,所以成员函数不占类的空间。A3:虽然类为空,但是如果都是0字节,那地址都没有,怎么区分与其他类,所以象征性给个1字节,这个字节叫占位符。原创 2023-09-03 00:00:55 · 56 阅读 · 0 评论 -
用数组方式创建二叉树--堆
首先把数组传给HPqsort,然后HPqsort接收数组的值传给ADjustup函数,利用ADjustup函数实现向上调整的效果。OK,大堆小堆实现了,我们来实现一下删除,假如我们从头节点开始删,然后先将头节点与我们的最后一个节点交换,然后进行向下调整。可以看见没走完HPpop时,我们的二叉树有6个数,走完之后s只剩五个了,哪一个就是被删掉了。经过我们的运算之后就变成了{32,50,60,100,65,70},成了一个小堆。我们的数组刚开始是{65,100,70,32,50,60}2^0+2^1+……原创 2023-08-29 16:22:52 · 541 阅读 · 0 评论 -
C++ priority_queue
priority_queue也叫优先级队列,说是叫队列,实际上是一个堆。priority_queue的接口:这些接口可以直接使用vector作为底层来使用:main函数调用运行:发现结果自己按照大堆排序了,它可以排序的原因是因为它的底层是堆,用了堆的向上调整,向下调整。可以大堆排序就可以小堆排序。原创 2023-10-10 22:26:57 · 150 阅读 · 0 评论 -
C++ 继承
这是因为派生类初始化父类成员变量必须把父类当成一个对象,而不是直接去初始化父类的成员变量,如果派生类不写构造函数会默认调用父类构造函数,如果派生类想写构造函数必须显示调用父类构造函数。int 和double是相近类型,因为都表示大小,把double d赋值给int i,那么r对int d取地址实际上不是对d取地址,而是对临时变量取地址。Add是模版,没有实例化,在预编译阶段找不到地址,但是fun我们一开始就定义了是void类型,所以不管是预处理,编译,链接阶段都可以找到它的地址。没加const没有报错。原创 2023-10-21 20:33:55 · 193 阅读 · 0 评论 -
C++ BinarySercahTree 递归版本
Inorder()在c++ BinarySerschTree for verison写了。还是按照那种嵌套的方式来写递归。现在来写查找。原创 2023-10-25 19:08:55 · 212 阅读 · 0 评论 -
C++ Set
set不同于vector,strin,list这种存储容器,set是一种关联式容器,底层是搜二叉;原创 2023-10-31 19:44:17 · 169 阅读 · 0 评论 -
C++ RBTree 理论
1.每个节点不是红色就是黑色2.根节点是黑色的3.不能有两个连续的红色节点 ,即可以出现 红黑 黑黑 不能出现红红4.每条路径上的黑色机节点数量不一样至于性质5:每个叶子结点都是黑色的,这里的叶子节点并不是真的叶子节点,而是NIL节点,即空节点。如图(a):NIL节点有什么作用?如图(a-2),有多少条路径:正确答案是有7条。路径路径的判断规则是:从根节点到NULL。原创 2023-11-11 22:57:13 · 1074 阅读 · 0 评论 -
C++ 二叉搜索树 for循环版本
首先写一个模版,然后写一个搜索二叉树的类 BSTree,类里面给 BSTe进行重命名为:Node。private:再写一个搜二叉的结构体K _key;K _key;原创 2023-10-25 12:58:30 · 103 阅读 · 0 评论 -
C++ 多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。原创 2023-10-21 23:27:37 · 227 阅读 · 0 评论 -
C++ 写一个日期类的注意事项
内联函数内联函数是为了替代宏函数而出来的。下面用宏实现一个ADD宏函数:会有什么问题呢?我们发现因为优先级问题,宏函数的直接替换导致结果偏离了我们的预设。所以我们需要加括号保证优先级,但是这样太麻烦了,如果是一个ADD函数就不用这么麻烦:因为ADD函数不像ADD宏函数那样无脑替换,它会进行先把实参算完再拿过来给形参,把形参算完之后再返回。但是函数的调用需要建立栈帧,假如我们需要调一万次ADD函数呢?原创 2023-10-28 15:44:29 · 100 阅读 · 0 评论 -
C++ 写一个Data类的注意问题
现在我们在main函数调用:d1没报错,d2报错了:这是因为我们main函数那个文件包的是.h文件,声明我们没有给缺省参数,声明就好比一种承诺,没给参数,我们d2没有默认参数就过不了。声明和定义不能同时给默认参数,我们把定义的默认参数去了就可以了。我们发现上面这段日期是有问题的,有点的是闰年,有的是13月,是一些不合法日期,所以我们要加日期有效判断。原创 2023-10-30 14:57:41 · 246 阅读 · 0 评论