自定义博客皮肤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)
  • 收藏
  • 关注

原创 删除二叉搜索树的节点(450)

但有一个孩子的时候直接返回孩子的地址,让当前节点的父节点直接指向孩子节点就好,然后释放当前节点,如果有左右孩子的话就要选择把其中一方连接到另一子数的下面。1,在叶子节点位置删除 2,在有左孩子没右孩子时的删除 3,在有右孩子没有左孩子时候的删除 4没有找到 5左右孩子都有时候的删除。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。另一个正确答案是 [5,2,6,null,4,null,7]。

2024-04-25 16:35:35 733

原创 二叉搜索树中的插入操作(力扣450)

解题思路:因为是二叉搜索树,所以肯定有一个位置的叶子节点可以直接插入,我们只需要递归遍历找到位置罢了。确认终止条件:遍历到空时停止,同时创建新节点,返回新节点,让下一个节点接着。,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。,新值和原始二叉搜索树中的任意节点值都不同。给定二叉搜索树(BST)的根节点。

2024-04-25 16:29:26 373

原创 二叉搜索树最近的公共先祖(力扣235)

中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(解题思路:第一是直接按二叉树的最近公共先祖来做,第二是利用二叉搜索树的特性,从上到下遍历。如果大了就遍历左边,如果小了就遍历右边。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。, 因为根据定义最近公共祖先节点可以为节点本身。

2024-04-25 16:18:11 336

原创 二叉树的最近公共祖先(力扣236)

解题思路:想法当然是从下往上记,如果碰到了就返回,那么很明显就要用后序遍历来做,递归三部曲:确定函数返回值已经参数,确定终止条件,确定单层递归的逻辑。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(if(root==p||root==q)return root;给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

2024-04-24 20:54:12 194 2

原创 二叉搜索树的众数(力扣501)

解题思路如下:直接暴力的算法就是遍历一遍树然后用map记录,最后再对map里的频率进行排序。但是这颗树是二叉搜索树,所以我们要利用好特性,在中序遍历的同时,设置变了count和maxTime来记录下出现的次数,其中当count大于maxTime时就可以动态改变最大值,而当相等时就把该数弹进容器里。}//是空的话说明cur遍历到叶子了。给你一个含重复值的二叉搜索树(BST)的根节点。,找出并返回 BST 中的所有。(即,出现频率最高的元素)。

2024-04-24 20:49:56 526

原创 二叉搜索树最小绝对差

解题思路:因为二叉树是二叉搜索树,所以我们可以得知差最小的数一定是它相邻的数,所以我们可以采用中序遍历把每个元素都放进vector中再进行相减比较,但是这样就会消耗额外的空间,所以我们可以采取我们的老朋友双指针来做。让一个pre指针指向cur上一次指向的位置然后相减再和最小值比较,在中序遍历处。差值是一个正数,其数值等于两值之差的绝对值。给你一个二叉搜索树的根节点。

2024-04-24 20:43:06 172

原创 验证二叉搜索树(98)

解题思路:可以直接中序遍历放进一个数组里根据特性判断是否是递增就可以,如果采用递归的思路话用中序遍历和创建一个指针指向前一个节点,根据前一个节点是否比上一个节点小来判断是否是二叉树。根节点的值是 5 ,但是右子节点的值是 4。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。

2024-04-22 21:10:14 255

原创 二叉搜索树中的搜索(力扣700)

解题思路:因为二叉搜索树的左小右大特点,中只是寻找比较目标,怎么序遍历都可以,终止条件就是遍历完毕和找到了,然后就遍历左右子树开始寻找就好了。返回以该节点为根的子树。如果节点不存在,则返回。你需要在 BST 中找到节点值等于。给定二叉搜索树(BST)的根节点。

2024-04-22 21:06:29 486

原创 合并二叉树(力扣617)

解题思路:实现两个二叉树同时递归遍历,遇到一方为空时就把另一方不为空的相同位置返回,所以这里特殊的是停止递归条件隐藏在上面,如果返回的是空值时自然不法继续进行(前提条件,前序遍历和在第一个二叉树上面构造最新的一颗二叉树)想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。

2024-04-22 21:02:48 280

原创 最大二叉树(力扣654)

[3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 []。- 只有一个元素,所以子节点是一个值为 1 的节点。- 只有一个元素,所以子节点是一个值为 0 的节点。- 空数组,无子节点。- 空数组,无子节点。

2024-04-22 20:58:17 789

原创 从中序后序构造二叉树(力扣106)

这题我也不太会敲,暂时只懂个思路。

2024-04-21 11:34:38 68

原创 路径总和(力扣112)

if(root->right){//向右遍历。if(root->left){//先左遍历。不存在 sum = 5 的根节点到叶子节点的路径。由于树是空的,所以不存在根节点到叶子节点的路径。等于目标和的根节点到叶节点路径如上图所示。

2024-04-21 11:32:57 377

原创 513.找树左下角的值

解题思路:用层序遍历。从右遍历到左最好一个肯定是。假设二叉树中至少有一个节点。

2024-04-21 11:29:32 222

原创 左叶子之和(力扣404)

解题思路:用后序遍历找左孩子,需要注意的是左叶子需要通过其父节点来判断其是不是左叶子。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。,返回所有左叶子之和。

2024-04-21 11:27:43 316

原创 二叉树的所有路径(力扣257)

解题思路:因为求的是路径,从根节点开始,所以采用中序遍历。并且要记录下路径,我们还要额外采用一个临时存放一条路径的容器,当遍历完一条时放入result中,再遍历另一条,这里采用的就是回溯了。// 中,中为什么写在这里,因为最后一个节点也要加入到path中。if (cur->right) { // 右。if (cur->left) { // 左。// 这才到了叶子节点。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。

2024-04-21 11:22:04 503

原创 平衡二叉树(后序遍历,力扣110)

解题思路:采取后序遍历的好处是先遍历节点得到高度,然后再判断高度差是否大于一,如果是的话就返回-1,不是就返回两高度中较大的高度加一就是父节点的高度。给定一个二叉树,判断它是否是。

2024-04-20 09:38:58 603 2

原创 完全二叉树(力扣222)

的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。解题思路:第一种是直接全部都遍历一遍,第二种是用完全二叉树的特殊性,判断是不是满二叉树,来节省时间和空间复杂度。,求出该树的节点个数。

2024-04-18 17:57:07 354

原创 二叉树的最小深度(力扣111)

解题思路如下:该题和最大深度类似,但有坑,就比如当左子树或右子树一方为空而其他一方不为空时,如果不特殊判断的话就会倒置返回0;最大深度求法可以看我主页中之前发的。具体代码实现:(图片来源代码随想录)

2024-04-18 17:53:39 200 2

原创 找到二叉树最大深度(力扣104)

解题思路:分别是用前序遍历和后序遍历,前序遍历就是正常的从上到下求深度,而后续遍历就是从下到上求高度,而高度和深度是互逆的,所以这里采用后续遍历,需要注意的是,最底层是从1开始的,所以遍历到底部时记录的高度时1+遍历。是指从根节点到最远叶子节点的最长路径上的节点数。

2024-04-18 17:49:36 405

原创 判断二叉树是否对称

解题思路:首先判断特殊情况,比如左右子树是否为一空一有,是否为两空,是否相等,然后递归判断外侧是否相等(即为左子树的左节点和右子树的右节点)和内侧是否相等(即为右子树的左节点和左子树的右节点)给你一个二叉树的根节点。, 检查它是否轴对称。

2024-04-17 20:44:10 227

原创 反转二叉树(力扣226)

解题思路:用队列进行前序遍历的同时把节点的左节点和右节点交换。

2024-04-17 20:39:13 547

原创 二叉树层序遍历

解题思路:因为二叉树本身不肯用来遍历,所以我们采取用队列来模拟二叉树的方法遍历二叉树,原理是把二叉树的节点放入队列中,并且设置size来控制每次的弹出,以此来分辨每次的输出到底是第几层的东西。具体代码如下:(图片来源,代码随想录)

2024-04-17 20:35:28 242

原创 二叉树递归遍历

2024-04-16 19:27:54 104

原创 优先级队列(力扣347,前k个高频元素)

大体思路:用map记录下来然后再快排,当然这样时间复杂度过高,我们也可以采用优先队列的方法。还没整懂pair那些基本的东西,这个补完知识点再弄。

2024-04-15 16:45:46 384

原创 滑动窗口最大值(力扣239)

解题思路:首先是用暴力循环来解,其次便是用队列来模拟这个滑动窗口,同时要自定义三个函数,一个pop用来弹出来保证滑动窗口的移动,同时我们把最大的放在队列口那里,当每次有更大的就把原来的挤出栈外,一个push用来把前面不够大的元素排挤出队列并且把最大的那个数压入队列,还有一个find来找到最大的元素。

2024-04-15 11:19:43 587

原创 删除字符串中两个相邻字符(力扣1047)

result.empty()) { // 将栈中元素放到result字符串汇总。// 此时字符串需要反转一下。解题思路:匹配的题用栈来做,这里用一个栈遍历支付串,遇到相同的就弹出去,最后再把栈转换成字符。在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。会选择两个相邻且相同的字母,并删除它们。给出由小写字母组成的字符串。

2024-04-14 15:24:21 200

原创 有效括号,力扣20题

解题思路如下:利用栈,找到向左开的括号,然后把对应的右括号放入栈中,然后对遍历的号进行匹配,如果和栈顶的括号相同,则通过,不相同的话就直接退出,并且考虑到是一左一右,所以字符串的长度要是个偶数,不是的话就直接跳过,同时不符合条件一共有三种可能 1. 左括号多了,2 右括号多了,3 括号不匹配,if(s.size()%2!//判断长度是否为奇数,是的话就肯定错。,判断字符串是否有效。

2024-04-14 14:41:38 429

原创 用队列来模拟栈

解题思路:首先搞清楚栈和队列的区别,然后一个队列便可以模拟栈,因为先进先出的关系,所以只用把前面的重新加载一次那么输出的顺序就和栈一样了。

2024-04-14 13:27:09 180

原创 用栈来模拟队列

思路:首先栈是先进后出,队列是先进先出,所以用两个栈来模拟队列,一个用来进,一个用来出,用来进的再弹给用来出的便是队列的顺序了,具体代码如下。

2024-04-14 13:23:41 441

原创 KMP算法

小小的了解了一下,还是不是很懂,二刷的时候再来搞定它。

2024-04-12 15:07:30 317

原创 反转字符串中的单词(力扣151)

特别需要注意的是判断条件是fast<=s.size();去空格做法:运用快慢指针,判断快指针指向的是否为空,然后赋给慢指针的指向位置,但是因为单词与单词之间是有一个空格的,所以用慢指针来给赋值空格,并且因为首单词前面是没有空格的,所以对首单词要特殊判断。难点:该字符串中单词与单词之间有空格并且单词之前和之后也有空格,如果直接进行翻转操作会导致空格也被反转过去,所以要进行去空格。=' ')//但快指针不为空时。

2024-04-11 21:25:00 599

原创 反转字符串(力扣541)

解题思路:可以直接写一个reverse函数,也可以用系统的reverse,同时要注意反转的规则,因为每次到达2k时翻转,所以我们直接自增量设为2k,同时注意库函数通常都是。

2024-04-11 15:34:26 409

原创 力扣344反转字符串

解题思路:用双指针和一个临时变量temp。

2024-04-11 12:31:01 352 1

原创 力扣18题(四数之和)

解题思路:和三数之和是一样的运用双指针来移动,只不过多了一层for循环在三数之和的外面,同时要进行的减枝操作也有挺多而且很细节。

2024-04-10 19:30:45 391 1

原创 力扣第15题三数之和

首先这题也可以用set来做但是去重麻烦,很难快速搞定,(用sort排序一遍先)所以我采用双指针来解决这道题,定义i,left,right,分别指向遍历头,和头的下一位以及最后一位。然后通过left和right的移动来判断这段里是否nums[i]+nums[left]+nums[right]==0,如果有就记录下来,然后再移动开始的节点i,需要注意的是去重操作,要对left和right对应的前后元素去重;

2024-04-10 18:06:59 1007 1

原创 力扣383(赎金信)

这题和之前异位的那道题很像。这里一共有两种解法,第一种还是我们的老朋友暴力解法,第二种就是用数组这个哈希表记录magin中出现的字母的次数,然后再比较所需要字母的次数;

2024-04-09 20:46:53 290

原创 四数相加||(力扣454)

第二种是使用哈希表中的unordered map,因为其底层是哈希,运算的效率最快,然后对前两个数组进行遍历,并把结果放到map中,再对cd也进行循环得到c+d的值,然后find 0-cd,最后加起来图中有多少次。首先第一种方法是直接暴力解法,使用4个for循环遍历。,请你计算有多少个元组。

2024-04-09 20:17:53 313

原创 两数之和(力扣第一题)

解题思路:可以使用两个for循环来直接暴力破解,也可以使用map记录前面遍历过的数及其位置,然后判断当前遍历的数与之前遍历数的和是否等于目标数。需要注意的点是明白map的语法,比如创建和插入等;你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。整数,并返回它们的数组下标。你可以想出一个时间复杂度小于。你可以按任意顺序返回答案。,请你在该数组中找出。

2024-04-09 16:03:29 301

原创 两个链表的交集(力扣349)

用·unordered_set来对需要查找的数列进行去重操作,创建答案也用unordered_set存放。输出结果中的每个元素一定是。[4,9] 也是可通过的。

2024-04-09 15:24:34 441

原创 哈希表(力扣242,有效的字母异位词)

运用哈希表的方法,因为因为字母只要26个,所以创立一个有26个字母的数组,遍历第一个串,有的话就加一,再遍历后一个串,有的话就减一,最后看加一减一是否抵消,最后值为0。中每个字符出现的次数都相同,则称。,编写一个函数来判断。

2024-04-08 18:17:40 131 1

空空如也

空空如也

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

TA关注的人

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