- 博客(72)
- 收藏
- 关注
原创 【Day-36慢就是快】代码随想录-二叉树-删除二叉搜索树中的节点
删除节点就涉及到结构调整了。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
2023-09-14 15:34:47
140
原创 【Day-36慢就是快】代码随想录-二叉树-二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回任意有效的结果。
2023-09-14 13:44:37
137
原创 【Day-35慢就是快】代码随想录-二叉树-二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
2023-09-13 14:50:22
141
原创 【Day-35慢就是快】代码随想录-二叉树-二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
2023-09-13 11:22:44
122
原创 【Day-34慢就是快】代码随想录-二叉树-搜索树中的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
2023-09-11 10:07:47
78
原创 【Day-34慢就是快】代码随想录-二叉树-二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
2023-09-11 09:34:35
97
原创 【Day-33慢就是快】代码随想录-二叉树-二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。你需要在BST中找到节点值等于给定值的节点。返回以该节点为根的子树。如果节点不存在,则返回 NULL。
2023-09-10 10:21:27
136
原创 【Day-32慢就是快】代码随想录-二叉树-合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
2023-09-08 10:57:25
73
原创 【Day-31慢就是快】代码随想录-二叉树-中序和后序遍历构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。
2023-09-07 10:18:10
66
原创 【Day-31慢就是快】代码随想录-二叉树-路径之和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。
2023-09-07 09:17:43
55
原创 【Day-30慢就是快】代码随想录-二叉树-左叶子之和
此题的特殊之处在于,需要根据当前节点的父节点来判断当前节点是否为左叶子节点。根据叶子节点本身是无法判断其自身是否为左叶子节点。按照题目的要求,自己给出左叶子节点的定义和判断条件是关键。这道题的迭代法我感觉比递归清楚一点,递归需要继续深入理解。
2023-09-06 09:06:40
39
原创 【Day-29慢就是快】代码随想录-二叉树-周末总结
学习对称二叉树的判别方法。本质是比较两棵树(根节点的左右子树),遍历两个树并比较内侧和外侧的节点是否相等。一棵树左右中遍历,一棵树右左中遍历。我们可以首先根据左右子树是否为空,排除掉简单的集中情况。对于左右子树都不为空,再单独进行节点相等判断。我们借助队列,判断节点是否相等。需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素,认识到这一点之后就发现:用队列,用栈,甚至用数组,都是可以的。
2023-09-05 15:31:40
133
原创 【Day-28慢就是快】代码随想录-二叉树-平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
2023-09-04 12:52:24
71
原创 【Day-27慢就是快】代码随想录-二叉树-二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。
2023-09-03 15:17:15
246
原创 【Day-27满就是快】代码随想录-二叉树-二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。
2023-09-03 14:47:56
70
原创 【Day-26慢就是快】代码随想录-二叉树-周末总结
所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表。
2023-09-02 21:07:10
213
原创 【Day-25慢就是快】代码随想录-二叉树-翻转二叉树
关键在于遍历顺序,前中后序应该选哪一种遍历顺序?(一些同学这道题都过了,但是不知道自己用的是什么顺序)首先,确定递归参数和返回值。需要传入的参数为根节点root,返回的也是根节点。针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。这也是造成了二叉树的题目“一看就会,一写就废”的原因。当前节点为空时停止。那么层序遍历可以不可以呢?2. 使用栈进行迭代法。
2023-09-01 09:48:38
241
原创 【Day-24慢就是快】代码随想录-二叉树-二叉树的层序遍历
2. 给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)3. 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。给你一个二叉树,请你返回其按 层序遍历 得到的节点值。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。4.给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。6. 您需要在二叉树的每一行中找到最大的值。5. 给定一个 N 叉树,返回其节点值的。(即从左到右,逐层遍历)。
2023-08-31 09:55:50
128
原创 【Day23-慢就是快】代码随想录-二叉树-迭代遍历
然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。中左右,先处理中间节点,先将根节点放入栈中,然后将右孩子入栈,再加入左孩子。此时大家应该知道我们用栈也可以是实现二叉树的前后中序遍历了。用迭代法实现二叉树的前后中序遍历。1. 前序遍历(迭代法)
2023-08-30 09:58:49
119
原创 【Day23-慢就是快】代码随想录-二叉树-递归遍历
2. 确定终止条件:写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。1. 确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。3. 确定单层递归的逻辑:确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。本篇介绍前后中序的递归写法。
2023-08-30 08:41:32
71
原创 【Day-22慢就是快】代码随想录-二叉树-理论基础
int val;大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。
2023-08-29 14:17:11
92
原创 【Day-22慢就是快】代码随想录-栈与队列-前K个高频元素
首先统计元素出现的频率,这一类的问题可以使用map来进行统计。给定一个非空的整数数组,返回其中出现频率前 k 高的元素。然后是对频率进行排序,这里我们可以使用一种 容器适配器就是。
2023-08-29 13:54:19
125
原创 【Day-21慢就是快】代码随想录-栈与队列-逆波兰表达式求值
其中,正数范围为 0 到 2,147,483,647。32位整数的范围为 -2,147,483,648 到 2,147,483,647,这些范围都适用于。去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )。该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )。将表达式放入栈中,遇到运算符就取出栈顶两个数进行运算。逆波兰表达式相当于二叉树中的后序遍历。
2023-08-28 09:06:48
105
原创 【Day-20慢就是快】代码随想录-栈与队列-删除字符串中的所有相邻重复项
我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。不用考虑太复杂,找必须相邻的相等元素,用栈遍历存储判断就可以。在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。
2023-08-26 14:31:59
88
原创 【Day-20慢就是快】代码随想录-栈与队列-有效的括号
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。
2023-08-26 14:04:54
215
原创 【Day-19慢就是快】代码随想录-栈与队列-用队列实现栈
把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的!所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。方法2:只用一个队列。方法1:用两个队列模拟。具体的思路还是看动画。
2023-08-25 14:25:49
78
原创 【Day-19慢就是快】代码随想录-栈和队列-用栈实现队列
再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。push(x) -- 将一个元素放入队列的尾部。在push数据的时候,只要数据放进输入栈就好,peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。pop() -- 从队列首部移除元素。模拟题,不涉及具体算法。最后如何判断队列为空呢?
2023-08-25 14:04:35
78
原创 【Day-18慢就是快】代码随想录-栈与队列-理论基础
HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。3. 从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。C++标准库是有多个版本的,要知道我们使用的STL是哪个版本,才能知道对应的栈和队列的实现原理。
2023-08-24 15:19:27
67
原创 【Day-18慢就是快】代码随想录-双指针法-四数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。找出所有满足条件且不重复的四元组。四数之和,和三数之和是一个思路,都是使用双指针法, 基本解法就是在三数之和的基础上再套一层for循环。答案中不可以包含重复的四元组。
2023-08-24 15:10:27
59
原创 【Day-18慢就是快】代码随想录-双指针法-三数之和
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。最前面的指针i用来循环遍历,然后后面的left和right指针进行判断。关键是先要升序排列。
2023-08-24 14:55:57
49
原创 【Day-17慢就是快】代码随想录-双指针法-环形链表2
可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。题意: 给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回 null。首先,判断链表是否有环:快慢指针法。:不允许修改给定的链表。如何寻找环的入口呢?
2023-08-23 14:14:33
50
原创 【Day-17慢就是快】代码随想录-双指针法-链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。
2023-08-23 13:44:36
75
原创 【Day-16慢就是快】代码随想录-双指针法-删除链表倒数第N个节点
如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。再强调一下:fast多走一步是为了slow指向删除节点的前一个,而不是指向删除节点。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?
2023-08-22 09:46:10
89
原创 【Day-16慢就是快】代码随想录-双指针法-反转链表
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。使用三个指针,cur指向头结点,temp存放cur->next不丢失,pre指向cur前面。关键是记得指针指向交换的顺序。以及交换过程中固定的流程。题意:反转一个单链表。循环结束的判断条件。
2023-08-22 09:22:53
75
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人