Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit f913dc3

Browse files
Update
1 parent 1e0c5e6 commit f913dc3

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+
<img src='../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)