- 博客(16)
- 收藏
- 关注
原创 先序线索二叉树遍历以及找到前驱
相对于中序线索二叉树,先序线索二叉树的遍历明显简单一点,因为我们不需要取寻找第一个结点(先序遍历的第一个结点就是根节点),那么只需要找到先序遍历中对应节点的后继便可以了~,所以得到某一个点的前驱需要知道其双亲结点,但是二叉树的数据结构决定了我们无法直接从子节点得到双亲结点),但是我们可以通过三叉链表来建立一个从子节点指向双亲结点的指针。我们可以看到,其实构造先序线索二叉树的代码和构造中序线索二叉树的代码几乎一模一样,唯一不同的便是遍历顺序。调用LastNode。LastNode开始。
2025-03-14 15:07:14
820
原创 线性表相关代码(顺序表+单链表)
在顺序表的静态分配实现中,我们预先定义了一个固定大小的数组 data 来存储元素,通过 length 记录当前表中元素的实际个数。插入操作时,首先检查插入位置 i 的合法性以及表是否已满,若满足条件,则将插入位置及之后的元素依次向后移动一位,再将新元素插入指定位置。在实际应用场景中,无论是信息管理系统中的数据存储,还是算法竞赛中的数据处理,线性表都发挥着不可或缺的作用。链式存储是线性表的另一种重要存储方式,它通过指针将各个数据元素链接起来,克服了顺序存储需要连续内存空间的局限性。
2025-03-09 19:51:26
366
原创 后缀表达式求值
学过数据结构的小伙伴都知道,栈的底层其实就是数组,那我们可不可以自己用数组来模拟栈呢?通过上述代码,我们可以知道,我们仅仅需要。但是上述代码时间复杂度还是太高了,而且多调用了一个函数,有没有办法不调用这个函数呢?都到这一步了,过力扣的数据集速度还是不够快,有没有更快的方法呢?本题其实就是后缀表达式求值,求值方法在题中已经给到,不再赘述。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。每个运算对象可以是整数,也可以是另一个逆波兰表达式。中除了运算符就是数字,所以我们可以把数字的情况放在。
2025-02-24 22:50:56
503
原创 三种遍历方法验证二叉搜索树
给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。[1, 104]
2025-02-18 21:44:34
706
原创 递归在树中的利用
判断的标准是这两棵树在结构上相同,并且对应节点的值也相同。我们就可以采用递归的方式遍历左右子树,判断它们相不相等,递归的边界条件是p和q有一个为空,此时就可以判断两个结点是否相同了。其实很简单,由于我们得到的深度是非负数,那么如果我们在递归过程中发现左右子树不平衡,就返回-1。其实这一题和上一题几乎就是一模一样的,但是判断的对象变成了左子树和右子树是否相等,我们完全可以借用上一题的代码,小作修改而成。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。,编写一个函数来检验这两棵树是否相同。
2025-02-16 23:55:50
2020
原创 两种得到二叉树深度的递归方法
递归二叉树的深度有两种方法,一种就是直接采用递归,递归到叶子结点之后返回,记录左子树和右子树的深度,取它们的最大值加1为二叉树的深度。还有一种方式就是我们可以在递归的过程中记录当前已经遍历过的结点个数,设置一个全局变量,实时更新最大值。是指从根节点到最远叶子节点的最长路径上的节点数。
2025-02-15 23:27:22
372
原创 链表中删除结点的算法
不是链表中的最后一个节点,并且是给定节点的值不存在于链表中,我们就可以不删除对应。这道题一般的思路就是我们先遍历一遍数组,得到数组的长度,而后再遍历到倒数第n个。指针就到倒数第 n + 1 个结点处,也就是目标结点的前一个。注意,删除节点并不是指从内存中删除它。这题比较简单,由于不需要删除头结点,所以不用设置。,而是删除其下一个节点,而把下一个节点的值放在。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。,我们想删除它其中的一个节点。不是链表中的最后一个节点。结点到最后一个结点的时候,
2025-02-14 23:51:50
967
原创 环形链表笔记+刷题
首先我们假设当慢指针走到起点的时候,快指针正好比慢指针快一步(最坏情况),则快指针需要走 环长-1 步才能与慢指针相遇,而这时慢指针还没有走完一圈,最坏情况是如此,其他情况自然也是如此了。本题我们可以使用快慢指针做,由于慢指针每次向前移动一步,所以慢指针肯定会走到环里面去,而快指针相对于慢指针也是每次向前移动一步,在环里面肯定会相遇,基于此,我们不难写出以下代码。指针再次到达,则链表中存在环。首先有一个结论:快慢指针相遇的时候,慢指针还没有走完一圈。也就是说,快指针和慢指针相遇之后,慢指针走。
2025-02-13 21:43:28
1577
原创 反转链表解释+力扣刷题
学习过链表的朋友们都知道,链表的节点是由指针和数值组成的,每个指针都指向下一个链表,这就是链表的逻辑结构,而反转链表实际上就是将指针反转过来,指向前一个元素,且头节点指向。,头节点的下一个节点指向头节点……是一个正整数,它的值小于或等于链表的长度。,由于我们在分析反转链表时得到了一个结论:**反转完成之后,你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。的整数倍,那么请将最后剩余的节点保持原有顺序。,请你反转链表,并返回反转后的链表。,我们假设这一段链表的前面一个链表为。
2025-02-11 23:19:34
1033
原创 二分查找练习
那么本题可以利用上题我们得到的结论:只要一个数大于最后一个数,那么这个数就处在整个数组中较大的一部分,也就是上题中的。其实很简单,上面我们提到了,只要一个数大于最后一个数,那么这个数就处在整个数组中较大的一部分,那么是。,反之,如果一个数小于等于最后一个数,那么这个数就处在整个数组中较小的一部分,也就是上题中的。的元素,由于峰值一定在数组内,所以最右边的元素一定是蓝色,又由于“对于所有有效的。的元素,由于最小元素一定在数组内,所以最右边的元素一定是蓝色,所以我们依然在。的数组,预先按照升序排列,经由。
2025-02-10 21:29:25
995
原创 二分查找解析
给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]输入:nums = [], target = 0输出:[-1,-1]nums。
2025-02-09 21:01:36
868
原创 滑动窗口的运用
给定一个含有n个正整数的数组和一个正整数target找出该数组中满足其总和大于等于target的长度最小的,并返回其长度**。**如果不存在符合条件的子数组,返回0。
2025-02-08 17:38:47
2022
原创 相向双指针练习
整体的思路就是这样,所以沿用三数之和的求解思路,首先对数组排序,而后再用一个双指针,便可以得出结果了,需要注意的是,我们使用。如同前后缀的方法啊,我们还是把洼地看成是宽度为1的桶,如果我们一开始只知道左边的前缀最大值和右边的后缀最大值,比如示例一中的。来说,它的前置最大值为1,后缀最大值为3,由于前缀最大值不会再缩小(也就是“桶”的高度不会再缩小),所以我们可以认为。中,而后将较短的那条线的下标向中间靠拢一位,重复上述操作,并且将得到的容量不断比较,替换,便可以得到最大的容量;
2025-02-07 13:20:46
541
原创 力扣刷题笔记
题目中还提到,答案中不可以包含重复的三元组,那么我们如何进行去重呢?很简单,只需要在移动指针的时候将当前指针对应的数组元素和移动前对应的数组元素进行对比,如果相同则继续移动指针便可。其实这个题就是我们上面题增加了一个加数,整体逻辑是差不多的,由于输出的顺序和三元组的顺序并不重要,我们便可以直接对数组进行重新排序,又题中提到。都是大于9的呢,所以我们大可以将15排除在我们的答案之外,同样的道理,若两数相加小于。,我们便可以将较小的数排除在我们的答案之外,根据这个,我们可以用双指针法写出这道题。
2025-02-06 18:23:13
594
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人