Skip to content

Commit 25772fa

Browse files
Update
1 parent c08df22 commit 25772fa

10 files changed

+561
-11
lines changed

README.md

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,157 @@
7777

7878
(待补充.....)
7979

80+
# 算法模板
81+
82+
## 二分法
83+
(待补充....)
84+
85+
## KMP
86+
87+
(待补充....)
88+
89+
## 二叉树
90+
91+
### 深度优先遍历(递归)
92+
93+
前序遍历(中左右)
94+
```
95+
void traversal(TreeNode* cur, vector<int>& vec) {
96+
if (cur == NULL) return;
97+
vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方
98+
traversal(cur->left, vec); // 左
99+
traversal(cur->right, vec); // 右
100+
}
101+
```
102+
中序遍历(左中右)
103+
```
104+
void traversal(TreeNode* cur, vector<int>& vec) {
105+
if (cur == NULL) return;
106+
traversal(cur->left, vec); // 左
107+
vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方
108+
traversal(cur->right, vec); // 右
109+
}
110+
```
111+
中序遍历(中左右)
112+
```
113+
void traversal(TreeNode* cur, vector<int>& vec) {
114+
if (cur == NULL) return;
115+
vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方
116+
traversal(cur->left, vec); // 左
117+
traversal(cur->right, vec); // 右
118+
}
119+
```
120+
121+
### 深度优先遍历:迭代法(使用栈模拟递归)
122+
123+
相关题解:[0094.二叉树的中序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0094.二叉树的中序遍历.md)
124+
125+
前序遍历(中左右)
126+
```
127+
vector<int> preorderTraversal(TreeNode* root) {
128+
vector<int> result;
129+
stack<TreeNode*> st;
130+
if (root != NULL) st.push(root);
131+
while (!st.empty()) {
132+
TreeNode* node = st.top();
133+
if (node != NULL) {
134+
st.pop();
135+
if (node->right) st.push(node->right); // 右
136+
if (node->left) st.push(node->left); // 左
137+
st.push(node); // 中
138+
st.push(NULL);
139+
} else {
140+
st.pop();
141+
node = st.top();
142+
st.pop();
143+
result.push_back(node->val); // 节点处理逻辑
144+
}
145+
}
146+
return result;
147+
}
148+
149+
```
150+
151+
中序遍历(左中右)
152+
```
153+
vector<int> inorderTraversal(TreeNode* root) {
154+
vector<int> result; // 存放中序遍历的元素
155+
stack<TreeNode*> st;
156+
if (root != NULL) st.push(root);
157+
while (!st.empty()) {
158+
TreeNode* node = st.top();
159+
if (node != NULL) {
160+
st.pop();
161+
if (node->right) st.push(node->right); // 右
162+
st.push(node); // 中
163+
st.push(NULL);
164+
if (node->left) st.push(node->left); // 左
165+
} else {
166+
st.pop();
167+
node = st.top();
168+
st.pop();
169+
result.push_back(node->val); // 节点处理逻辑
170+
}
171+
}
172+
return result;
173+
}
174+
```
175+
176+
后序遍历(左右中)
177+
```
178+
vector<int> postorderTraversal(TreeNode* root) {
179+
vector<int> result;
180+
stack<TreeNode*> st;
181+
if (root != NULL) st.push(root);
182+
while (!st.empty()) {
183+
TreeNode* node = st.top();
184+
if (node != NULL) {
185+
st.pop();
186+
st.push(node); // 中
187+
st.push(NULL);
188+
if (node->right) st.push(node->right); // 右
189+
if (node->left) st.push(node->left); // 左
190+
191+
} else {
192+
st.pop();
193+
node = st.top();
194+
st.pop();
195+
result.push_back(node->val); // 节点处理逻辑
196+
}
197+
}
198+
return result;
199+
}
200+
```
201+
### 广度优先遍历(队列)
202+
203+
相关题解:[0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md)
204+
205+
```
206+
vector<vector<int>> levelOrder(TreeNode* root) {
207+
queue<TreeNode*> que;
208+
if (root != NULL) que.push(root);
209+
vector<vector<int>> result;
210+
while (!que.empty()) {
211+
int size = que.size();
212+
vector<int> vec;
213+
for (int i = 0; i < size; i++) {// 这里一定要使用固定大小size,不要使用que.size()
214+
TreeNode* node = que.front();
215+
que.pop();
216+
vec.push_back(node->val); // 节点处理的逻辑
217+
if (node->left) que.push(node->left);
218+
if (node->right) que.push(node->right);
219+
}
220+
result.push_back(vec);
221+
}
222+
return result;
223+
}
224+
225+
```
226+
227+
### 二叉树深度
228+
229+
### 二叉树节点数量
230+
80231
# LeetCode 最强题解:
81232

82233
|题目 | 类型 | 难度 | 解题方法 |

problems/0094.二叉树的中序遍历.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
33

44
## 思路
55

6+
7+
8+
69
094.二叉树的中序遍历
710
144.二叉树的前序遍历
811
145.二叉树的后序遍历

problems/0101.对称二叉树.md

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,110 @@ https://leetcode-cn.com/problems/symmetric-tree/
33

44
## 思路
55

6-
这是考察二叉树基本操作的经典题目,递归的方式相对好理解一些,迭代的方法 我看大家清一色使用队列,其实使用栈也是可以的,只不过遍历的顺序不同而已,关键是要理解只要是对称比较就可以了,遍历的顺序无所谓的。
6+
这是考察二叉树基本操作的经典题目,递归的方式相对好理解一些,迭代法看大家清一色使用队列,其实使用栈也是可以的,只不过遍历的顺序不同而已,关键是要理解只要是对称比较就可以了,遍历的顺序无所谓的。
7+
8+
9+
### 递归法
10+
11+
#### 递归三部曲
12+
13+
* 确定递归函数的参数和返回值
14+
* 确定终止条件
15+
* 确定单层递归的逻辑
16+
17+
##### 确定递归函数的参数和返回值
18+
19+
判断左右孩子是否对称,所以传入的参数为左指针和右指针,那么就返回是否是对称的就可以了,所以返回值是布尔类型。
20+
21+
代码如下:
22+
```
23+
bool compare(TreeNode* left, TreeNode* right)
24+
```
25+
26+
##### 确定终止条件
27+
28+
* 左孩子为空,右孩子不为空,不对称,return false
29+
* 左不为空,右为空,不对称 return false
30+
* 左右都为空,对称,返回true
31+
* 左右都不为空,比较节点数值,不相同就return false
32+
33+
代码如下:
34+
```
35+
if (left == NULL && right != NULL) return false;
36+
else if (left != NULL && right == NULL) return false;
37+
else if (left == NULL && right == NULL) return true;
38+
else if (left->val != right->val) return false;
39+
```
40+
41+
##### 确定单层递归的逻辑
42+
43+
* 比较二叉树外侧是否对称:传入的是左孩子的左指针,右孩子的右指针。
44+
* 比较内测是否对称,传入左孩子的右指针,右孩子的左指针。
45+
* 如果左右都对称就返回true ,有一侧不对称就返回false 。
46+
47+
代码如下:
48+
49+
```
50+
bool outside = compare(left->left, right->right);
51+
bool inside = compare(left->right, right->left);
52+
return outside && inside;
53+
```
54+
55+
这样递归的C++代码就写出来了,如下:
56+
57+
```
58+
class Solution {
59+
public:
60+
bool compare(TreeNode* left, TreeNode* right) {
61+
if (left == NULL && right != NULL) return false;
62+
else if (left != NULL && right == NULL) return false;
63+
else if (left == NULL && right == NULL) return true;
64+
else if (left->val != right->val) return false;
65+
else return compare(left->left, right->right) && compare(left->right, right->left);
66+
67+
}
68+
bool isSymmetric(TreeNode* root) {
69+
if (root == NULL) return true;
70+
return compare(root->left, root->right);
71+
}
72+
};
73+
```
74+
75+
### 迭代法
76+
77+
通过队列来判断二叉树内侧和外侧是否相等,如动画所示:
78+
79+
<video src='../video/对称二叉树.mp4' controls='controls' width='640' height='320' autoplay='autoplay'> Your browser does not support the video tag.</video></div>
80+
81+
代码如下:
82+
83+
```
84+
class Solution {
85+
public:
86+
bool isSymmetric(TreeNode* root) {
87+
if (root == NULL) return true;
88+
queue<TreeNode*> que;
89+
que.push(root->left);
90+
que.push(root->right);
91+
while (!que.empty()) {
92+
TreeNode* leftNode = que.front(); que.pop();
93+
TreeNode* rightNode = que.front(); que.pop();
94+
if (!leftNode && !rightNode) {
95+
continue;
96+
}
97+
if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {
98+
return false;
99+
}
100+
que.push(leftNode->left);
101+
que.push(rightNode->right);
102+
que.push(leftNode->right);
103+
que.push(rightNode->left);
104+
}
105+
return true;
106+
}
107+
};
108+
```
109+
其实使用栈也是可以的,只要把队列原封不动的改成栈就可以了,我下面也给出了代码。
7110

8111
## C++代码
9112

problems/0104.二叉树的最大深度.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public:
2121
};
2222
```
2323

24-
### BFS
24+
### 迭代法
2525

2626
```
2727
class Solution {

problems/0111.二叉树的最小深度.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public:
2929
3030
```
3131

32-
### BFS
32+
### 迭代法
3333
```
3434
class Solution {
3535
public:

problems/0142.环形链表II.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ https://leetcode-cn.com/problems/linked-list-cycle-ii/
55

66
这道题目,不仅考察对链表的操作,而且还需要一些数学运算。
77

8-
**首先如何判断链表有环呢**
8+
主要考察两知识点:
9+
10+
* 判断链表是否环
11+
* 如果有环,如何找到这个环的入口
12+
13+
### **首先如何判断链表有环呢**
914

1015
可以使用快慢指针法, 分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。
1116

@@ -26,7 +31,9 @@ fast和slow各自再走一步, fast和slow就相遇了
2631
这是因为fast是走两步,slow是走一步,**其实相对于slow来说,fast是一个节点一个节点的靠近slow的**,所以fast一定可以和slow重合。
2732

2833

29-
此时我们已经可以判断链表是否有环了,那么接下来要找这个环的入口了
34+
### 如果有环,如何找到这个环的入口
35+
36+
**此时我们已经可以判断链表是否有环了,那么接下来要找这个环的入口了**
3037

3138

3239
假设从头结点到环形入口节点 的节点数为x。

0 commit comments

Comments
 (0)