Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf913dc3

Browse files
Update
1 parent1e0c5e6 commitf913dc3

File tree

4 files changed

+87
-59
lines changed

4 files changed

+87
-59
lines changed

‎README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@
309309
|[0501.二叉搜索树中的众数](https://github.com/youngyangyang04/leetcode/blob/master/problems/0501.二叉搜索树中的众数.md)|二叉树|简单|**递归/中序遍历**|
310310
|[0513.找树左下角的值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0513.找树左下角的值.md)|二叉树|中等|**递归****迭代**|
311311
|[0515.在每个树行中找最大值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0515.在每个树行中找最大值.md)|二叉树|简单|**广度优先搜索/队列**|
312+
|[0530.二叉搜索树的最小绝对差](https://github.com/youngyangyang04/leetcode/blob/master/problems/0530.二叉搜索树的最小绝对差.md)|二叉树搜索树|简单|**递归****迭代**|
312313
|[0538.把二叉搜索树转换为累加树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0538.把二叉搜索树转换为累加树.md)|二叉树|简单|**递归****迭代**|
313314
|[0541.反转字符串II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0541.反转字符串II.md)|字符串|简单|**模拟**|
314315
|[0559.N叉树的最大深度](https://github.com/youngyangyang04/leetcode/blob/master/problems/0559.N叉树的最大深度.md)|N叉树|简单|**递归**|
@@ -336,7 +337,7 @@
336337

337338
#关于作者
338339

339-
大家好,我是程序员Carl,ACM 校赛、黑龙江省赛、东北四省赛金牌,和亚洲区域赛铜牌获得者,哈工大计算机硕士毕业,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。
340+
大家好,我是程序员Carl,哈工大师兄,ACM 校赛、黑龙江省赛、东北四省赛金牌、亚洲区域赛铜牌获得者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。
340341

341342
**加我的微信,备注:「个人简单介绍」+「组队刷题」**, 拉你进刷题群,每天一道经典题目分析,而且题目不是孤立的,每一道题目之间都是有关系的,都是由浅入深一脉相承的,所以学习效果最好是每篇连续着看,也许之前你会某些知识点,但是一直没有把知识点串起来,这里每天一篇文章就会帮你把知识点串起来。我也花了不少精力来整理我的题解,**而且我不会在群里发任何广告,纯自己学习和分享。 欢迎你的加入!**
342343

31.6 KB
Loading

‎problems/0028.实现strStr().md

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,29 @@ KMP的经典思想就是:**当出现字符串不匹配时,可以记录一部
3636

3737
本篇将以如下顺序来讲解KMP,
3838

39-
1. 什么是KMP
40-
2. KMP可以解决什么问题
41-
3. 分析KMP算法里的next数组
42-
4. 什么是前缀表
43-
5. 再分析为什么要是前缀表而不是什么哈希表其他表等等,偏偏要是前缀表。
44-
6. 一步一步推导前缀表是怎么求的
45-
7. 时间复杂度分析
46-
8. 前缀表与next数组的关系
47-
9. 如何使用next数组来做一遍匹配的过程
48-
10. 构造next数组
49-
11. 使用next数组进行匹配
50-
12. 前缀表统一减一(右移)的KMP实现方式
51-
13. 前缀表不减一的KMP实现方式
52-
14. 总结
53-
54-
可以说步步相扣,大家要跟紧,哈哈。
39+
40+
* 什么是KMP
41+
* KMP有什么用
42+
* 什么是前缀表
43+
* 为什么一定要用前缀表
44+
* 如何计算前缀表
45+
* 前缀表与next数组
46+
* 使用next数组来匹配
47+
* 时间复杂度分析
48+
* 构造next数组
49+
* 使用next数组来做匹配
50+
* 前缀表统一减一 C++代码实现
51+
* 前缀表(不减一)C++实现
52+
* 总结
53+
54+
55+
读完本篇可以顺便,把leetcode上28.实现strStr()题目做了。
56+
57+
如果文字实在看不下去,就看我在B站上的视频吧,如下:
58+
59+
*[帮你把KMP算法学个通透!(理论篇)B站](https://www.bilibili.com/video/BV1PD4y1o7nd/)
60+
*[帮你把KMP算法学个通透!(求next数组代码篇)B站](https://www.bilibili.com/video/BV1M5411j7Xx/)
61+
5562

5663
#什么是KMP
5764

@@ -525,5 +532,7 @@ public:
525532
可以说把KMP的每一个细微的细节都扣了出来,毫无遮掩的展示给大家了!
526533

527534

535+
536+
528537
>更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。
529538
Lines changed: 60 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,35 @@
11
##题目地址
22
https://leetcode-cn.com/problems/search-in-a-binary-search-tree/
33

4-
##思路
4+
>二叉搜索树登场!
55
6-
###递归法
6+
#700.二叉搜索树中的搜索
77

8-
先来看递归的实现方式
8+
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL
99

10-
依然从递归三要素开始分析:
10+
例如,
1111

12-
* 确定递归函数的参数和返回值
13-
* 确定终止条件
14-
* 确定单层递归的逻辑
12+
<imgsrc='../pics/700.二叉搜索树中的搜索.png'width=600> </img></div>
13+
14+
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
15+
16+
#思路
17+
18+
之前我们讲了都是普通二叉树,那么接下来看看二叉搜索树。
19+
20+
[关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/_ymfWYvTNd2GvWvC5HOE4A)中,我们已经讲过了二叉搜索树。
21+
22+
二叉搜索树是一个有序树:
23+
24+
* 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
25+
* 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
26+
* 它的左、右子树也分别为二叉搜索树
27+
28+
这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。
29+
30+
本题,其实就是在二叉搜索树中搜索一个节点。那么我们来看看应该如何遍历。
31+
32+
##递归法
1533

1634
1. 确定递归函数的参数和返回值
1735

@@ -33,17 +51,25 @@ if (root == NULL || root->val == val) return root;
3351

3452
3. 确定单层递归的逻辑
3553

36-
来看一下二叉搜索树的单层递归逻辑有何不同, 因为二叉搜索树的节点是有序的,所以可以有方向的去搜索,如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。
54+
看看二叉搜索树的单层递归逻辑有何不同。
55+
56+
因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。
57+
58+
如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。
3759

3860
代码如下:
3961

4062
```
41-
if (root->val > val) return searchBST(root->left, val);
63+
if (root->val > val) return searchBST(root->left, val); // 注意这里加了return
4264
if (root->val < val) return searchBST(root->right, val);
4365
return NULL;
4466
```
4567

46-
这里可能会疑惑,在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return, 这取决于对递归函数的定义,这里定义的递归函数,就是返回 要查找的元素所在的节点,而这个节点就是我们所求,所以直接return递归函数的返回值。
68+
这里可能会疑惑,在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return呢。
69+
70+
我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)中讲了,如果要搜索一条边,递归函数就要加返回值,这里也是一样的道理。
71+
72+
**因为搜索到目标节点了,就要立即return了,这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。**
4773

4874
整体代码如下:
4975

@@ -56,16 +82,23 @@ TreeNode* searchBST(TreeNode* root, int val) {
5682
}
5783
```
5884

59-
###迭代法
85+
##迭代法
86+
87+
一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。
88+
89+
对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。
90+
91+
对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。
92+
93+
**对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。**
6094

61-
一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历,其实因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。
95+
例如要搜索元素为3的节点,**我们不需要搜索其他节点,也不需要做回溯,查找的路径已经规划好了。**
6296

63-
对于一般二叉树,模拟递归的过程中还有一个回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。而对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。
97+
中间节点如果大于3就向左走,如果小于3就向右走,如图:
6498

65-
看如下图中的这颗二叉搜索树,例如要搜索元素为3的节点,我们不需要搜索其他节点,也不需要做回溯,查找的路径已经规划好了。
6699
![二叉搜索树](https://img-blog.csdnimg.cn/20200812190213280.png)
67100

68-
迭代法代码如下
101+
所以迭代法代码如下
69102

70103
```
71104
class Solution {
@@ -81,34 +114,19 @@ public:
81114
};
82115
```
83116

84-
##C++代码
117+
第一次看到了如此简单的迭代法,是不是感动的痛哭流涕,哭一会~
85118

86-
###递归
87-
```
88-
class Solution {
89-
public:
90-
TreeNode* searchBST(TreeNode* root, int val) {
91-
if (root == NULL || root->val == val) return root;
92-
if (root->val > val) return searchBST(root->left, val);
93-
if (root->val < val) return searchBST(root->right, val);
94-
return NULL;
95-
}
96-
};
97-
```
119+
#总结
120+
121+
本篇我们介绍了二叉搜索树的遍历方式,因为二叉搜索树的有序性,遍历的时候要比普通二叉树简单很多。
122+
123+
但是一些同学很容易忽略二叉搜索树的特性,所以写出遍历的代码就未必真的简单了。
124+
125+
所以针对二叉搜索树的题目,一样要利用其特性。
126+
127+
文中我依然给出递归和迭代两种方式,可以看出写法都非常简单,就是利用了二叉搜索树有序的特点。
128+
129+
就酱,如果学到了,就转发给身边需要的同学吧!
98130

99-
###迭代
100-
```
101-
class Solution {
102-
public:
103-
TreeNode* searchBST(TreeNode* root, int val) {
104-
while (root != NULL) {
105-
if (root->val > val) root = root->left;
106-
else if (root->val < val) root = root->right;
107-
else return root;
108-
}
109-
return NULL;
110-
}
111-
};
112-
```
113131

114132
>更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp