- 博客(26)
- 收藏
- 关注
原创 二叉树(七)--完全二叉树的节点个数
层序遍历就是在计算有多少节点进入队列就好了,这个思路还是很简单的。递归也是记录每次走过的节点就好了,记住要+1(也就是节点本身)。这道题用两种方法来做,一是层序遍历,二是递归。
2025-08-12 16:18:58
230
原创 二叉树(六)--对称二叉树
看到这个题的第一思路还是递归,但是递归方式得改变一下,看下面这个图,我们需要比较左子树外侧节点和右子树的外侧节点;还要比较左右子树的里侧节点。确定了执行逻辑,接下来解释确定终止条件,就是什么时候返回true什么时候返回false。有下面这四种情况:1.比较的两个节点都是空,证明就是递归完了,这个时候就返回true。2.比较的两个节点值不一样,返回false。3.比较的两个值一个是空节点另一个不是空节点,返回false。就这三种情况,理清楚这三种情况,代码就写完了。
2025-07-22 19:32:37
217
原创 二叉树(五)--翻转二叉树
这道题是让我们将左右子树翻转,将左边的子树和右边的子树交换。这里我们利用前序遍历,利用swap函数将左右子树交换这道题就做完了。
2025-07-22 18:21:57
226
原创 二叉树(四)--层序遍历
这道题是想让我们将完美二叉树的每层像链表一样连起来,从左往右连,最后一个节点指向NULL,这里我们可以创建两个前后节点,前节点来接每次循环的第一个节点,后节点用来更新前节点,不断向后更新,直到循环结束。这个题让我们从右边来看二叉树,换种思路来想,就是每层的最后一个元素,因为我们每层不是会放到队列里面嘛,所以要输出的元素不就可以从队列里面获取嘛,因为要输出右侧的,所以我们在进队列的时候就先进右子树的。这样这道题就做完了。这个题目是让我们求每层的平均值,求每层的平均值不就是求每次队列里面的值的平均值嘛?
2025-07-20 22:05:14
918
原创 二叉树(三)--后序遍历
这里就不介绍递归的方法了,着重说一下迭代的方法,先序遍历是中左右,后序遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了。
2025-07-17 14:43:46
149
原创 二叉树(二)--中序遍历
这道题用两种遍历方式来做,递归和迭代,递归就是在调用root->left之后就进行输出值;这里重点说一下迭代,还是用栈来做这道题,因为中序遍历是先输出左下角的值,所以我们要先到最左下角,每走一步就压一个入栈,到了左下角再往回退,回退的操作就是从栈里面弹出元素。1.while的条件为cur!st.empty()。
2025-07-17 11:27:42
231
原创 二叉树(一)--前序遍历
这道题用两种遍历方式来做,递归和迭代,递归就是在调用自身之前就进行输出值。这里重点说一下迭代。迭代需要一个栈来存每个节点。通过while循环去不断向下遍历,循环停止的标志是栈是否为空。每次循环先弹出栈顶元素,将这个元素放入res中。前序迭代遍历的思路和递归的思路有点类似。1.入栈的时候先入右节点再入左节点。
2025-07-17 10:49:29
202
原创 栈与队列(六)--滑动窗口最大值
push(value)时,我们需要和队列里面的数值进行比较,如果push的值大,就将队列里的值弹出,如果是传统队列的话,不太方便处理,所以这里使用双向队列。这里我们可以使用一个while循环,不停的去比较value的值和队列back的值,如果value的值更大,就将back的值弹出,这样就可以保证队头的值是最大的。在这个题目中,我们没有必要去维护滑动窗口里面的每一个值,我们仅仅需要维护最大的那个值就好了,我们可以将最大的值放在最前面,这个时候就可以想到单调队列,但是这个队列需要我们自己来实现。
2025-07-16 17:20:53
323
原创 栈与队列(五)--逆波兰表达式求值
逆波兰表达式求值是一种后缀表达式,这个特性是栈适合的,遇到数字就入栈,遇到运算符号就弹出两个数字,对这两个数字进行运算。1.记得运算时,后弹出的数字在前面。
2025-07-16 10:13:34
228
原创 栈与队列(三)--有效的括号
首先明确一点,我们需要用栈来实现这个功能。有三种不匹配的情况,一是如果长度不是2的倍数肯定是不匹配的。二是括号不对应,如{]。三是左括号比右括号多,如{{{}。下面我们就用栈来实现一下,每当遇到左括号[{(时,我们就往栈里面插入右括号。如果遇到右括号就对比栈顶的符号,如果不匹配(第二种情况),肯定就是无效的。如果最后对比完了,栈中还有数据(第三种情况),也肯定是无效的。
2025-07-14 17:16:22
200
原创 栈与队列(二)--用队列实现栈
这里我们需要有两个队列,一个是主队列,另一个是辅助队列。我们需要将主队列的数据移到辅助队列,只留下最后一个,这个是最后进来的,在栈中要最先出去,所以这个数据就是我们最先弹出的数据。处理完了之后,再将辅助队列的值拷贝到主队列。1.由于我们要留下一个数据,所以在while循环之前要对主队列的size-1。2.top()的时候记得push回top()的值。
2025-07-14 10:14:08
138
原创 栈与队列(一)--用栈实现队列
栈是先进后出,队列是先进先出。所以如果要用栈来实现队列的功能我们可以创建两个栈,分别是一个in_stack和out_stack,先从in_stack进,再从in_stack到out_stack,最后从out_stack出,这样就实现了先进先出了。
2025-07-14 09:19:49
189
原创 链表(七)--环形链表 II
这里说得很明白了,相遇点到环入口的距离就等于头节点到环入口的距离。此时我们就仅仅需要再创建两个指针,一个指向头节点,一个指向相遇节点,两者以此向前进,直到两者相等。这个相等的地方就是环的入口。我们需要先判断链表是否有环,做法是使用双指针,慢指针走一步,快指针走两步。如果有环的话,快慢指针一定会相遇。相遇点就如下面这个图所示。1.快慢指针相遇点到环入口的距离就是头节点到环入口的距离。
2025-07-11 14:18:01
223
原创 链表(六)--链表相交
我们先需要求出两个链表的长度,计算插值n,让长的链表先移动n步;然后再让两个链表同时移动,如果有环,就能走到一起。1.注意在求完链表长度的时候记得。2.比较两者的时候是比较的。
2025-07-07 23:01:29
110
原创 链表(五)--删除链表的倒数第N个节点
如果要删除倒数第n个节点,让fast移动n+1步,然后让fast和slow同时移动,直到fast指向链表末尾的后一个节点(NULL),这时的slow是指向要删除节点的前一个节点,符合我们前面的做法,要删除一个节点,需要指向该节点的前一个节点。最后我们删除这个节点就好了。1.还是建立一个虚假的头节点,让快慢指针。步,while的结束条件为。,这样确保慢指针能指向。
2025-07-07 15:30:33
202
原创 链表(四)--两两交换链表中的节点
(不包括虚假头节点)。按照下图的三个步骤来操作链表,因为按照题目,链表肯定是成对出现的,所以在while判断是否终止循环的时候就仅仅需要判断cur->next和cur->next->next是否为空指针就好了。这里需要创建两个临时变量用来保存当前对的第一个和下一对的第一个,图中就是1和3。(cur->next和cur->next->next->next),因为这两个变量刚刚好能顾及到当前循环的所有节点。2.每次更新cur节点,cur都是每对节点的前一个节点,所以更新cur的时候需要向后。
2025-07-06 23:03:26
168
原创 链表(三)--反转链表
这里思想也和之前的一样,新建立一个虚假的头节点,因为我们需要翻转链表,这里的虚假头节点反转之后就是新链表的尾节点,所以就是NULL。让cur等于实际头节点,pre等于NULL,运用。2.因为要while循环到链表的最后一位,所以while的终止条件是cur,这个时候cur是NULL,最后返回的是cur的前一个节点就是pre。(cur->next),因为要改变cur->next = pre,所以提前保存一下。,向后更新,最终反转链表。
2025-07-06 22:23:05
119
原创 链表(二)--移除链表元素
这里我们创建一个虚拟的头节点,用上一篇博客中说的规律,让LinkedNode* cur 停在需要移除节点的前一个节点,我们再创建一个临时变量tmp=cur->next,那么这个tmp就是我们要删除的元素了,看上面这个图,删除这个元素,仅仅是需要将cur的next直接指向tmp的next。然后在delete tmp,就完成了。
2025-07-06 16:32:54
167
原创 链表(一)--设计链表
在后续做题时为了不混淆,可以统一将需要删除或者增加节点时,就停在该节点的前一个节点。而是查询值的时候就设置LinkedNode* cur = fakehead->next;1.对于题目中的按照index来插入或者删除的题目,如果设置LinkedNode* cur = fakehead;在后续的while循环中while(index--),结束是在index的。2.在尾插的时候,通过while(cur->next!3.任何增删链表后,记得改变size。对于链表我们采用在头节点之前创建一个。
2025-07-06 16:24:07
349
原创 给Jetson AGX Orin控制器(Ubuntu系统)使用代理 ,手把手教程
但是这样设置之后仅仅是在浏览器中可以使用代理,没有办法在终端中使用代理。但是我们会经常需要在终端中使用代理,如git代码、下载压缩包等。在控制器中的ubuntu的环境下,使用代理软件不是很方便,为了更加方便的使用代理,这里会介绍一种简单的使用代理的方法,连接同一wifi,将手机代理共享给控制器,前提是手机需要有代理软件,查看手机的IP和端口。如果在固定的wifi下使用也可以将上面的两行指令写入.bashrc之中。并且修改Ubuntu中的设置中的网络代理的IP地址,设置为手机的IP和端口(
2025-04-23 16:37:40
442
原创 《从零开始学Rerun(C++)》(四)——基于Dora实战SLAM导航可视化
本次实验重点是基于激光SLAM实现精准定位,采用移植的hdl_localization算法。该算法依赖于先验点云地图,通过融合激光雷达传感器采集的实时点云数据与IMU传输的惯性测量信息,估算自身位姿。在此基础上,结合先验全局路径点,规划模块计算最优行驶轨迹,并将其传递至控制模块。控制模块通过横向控制调整转向角,纵向控制调节行驶速度,最终实现对车辆的精准控制。
2025-04-03 10:04:47
1755
原创 《从零开始学Rerun(C++)》(三)——基于Dora实时显示雷达点云
在本示例中,我们会创建两个Dora节点,Lidar节点发布点云数据,Rerun节点将数据发送到Rerun进行可视化。雷达点云的格式为:0-15个字节是点云的信息,0-3个字节是 点云帧的计数 4-7 Byte是保留位 8-15是时间戳(double 类型)从16个字节开始每16个字节表示一个点,每个点包含4个变量,排列方式是(X Y Z I),每个变量为float类型,占4个字节。
2025-03-17 16:23:43
1517
原创 《从零开始学Rerun(C++)》(二)——可视化点云地图与路径点
这是一个基于 Rerun 实现的小型Demo,主要用于可视化PCD文件和路径点。在激光SLAM领域NDT(正态分布变换)是一种经典的定位方法,能够利用预先构建的地图进行精准定位,而路径点则用于导航。本Demo可应用于激光SLAM场景,为地图构建、定位及路径规划提供直观的可视化支持。
2025-03-13 17:25:31
574
原创 《从零开始学Rerun(C++)》(一)——安装Rerun
提前下载并准备好该库后,可以在后续编译过程中配置相关路径,让编译过程顺利使用已下载好的库,而不是依赖自动下载,从而提高编译 rerun_cpp_sdk 的成功率和效率。在默认情况下,编译 rerun_cpp_sdk 时,会自动下载并构建 Apache Arrow 的 C++ 库,这个库是成功构建 Rerun C++ 的必要依赖项。完成上述操作后,打开终端,输入下面的指令运行,以此来验证 rerun 是否安装成功。回到rerun_cpp_sdk目录,完成rerun_cpp_sdk的安装。
2025-03-05 19:24:16
2639
原创 Ubuntu下的Postgresql 10(特定版本)环境配置
Ubuntu 默认包含 PostgreSQL。进入Postgresql的安装目录,修改配置文件:pg_hba.conf和postgresql.conf。若listen_addressde前面有#,将代码注释掉了的,需要去掉#。
2024-05-30 20:48:04
812
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅