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

Commit 8f5b6cf

Browse files
Update
1 parent ce56ef8 commit 8f5b6cf

14 files changed

+859
-11
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@
231231
|[0101.对称二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0101.对称二叉树.md) ||简单|**递归** **迭代/队列/栈**|
232232
|[0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md) ||中等|**广度优先搜索/队列**|
233233
|[0104.二叉树的最大深度](https://github.com/youngyangyang04/leetcode/blob/master/problems/0104.二叉树的最大深度.md) ||简单|**递归** **迭代/队列/BFS**|
234+
|[0105.从前序与中序遍历序列构造二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0105.从前序与中序遍历序列构造二叉树.md) ||中等|**递归**|
235+
|[0106.从中序与后序遍历序列构造二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0106.从中序与后序遍历序列构造二叉树.md) ||中等|**递归**|
234236
|[0107.二叉树的层次遍历II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0107.二叉树的层次遍历II.md) ||简单|**广度优先搜索/队列/BFS**|
235237
|[0110.平衡二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0110.平衡二叉树.md) ||简单|**递归**|
236238
|[0111.二叉树的最小深度](https://github.com/youngyangyang04/leetcode/blob/master/problems/0111.二叉树的最小深度.md) ||简单|**递归** **队列/BFS**|
@@ -273,7 +275,8 @@
273275
|[0538.把二叉搜索树转换为累加树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0538.把二叉搜索树转换为累加树.md) |二叉树 |简单|**递归** **迭代**|
274276
|[0541.反转字符串II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0541.反转字符串II.md) |字符串 |简单| **模拟**|
275277
|[0575.分糖果](https://github.com/youngyangyang04/leetcode/blob/master/problems/0575.分糖果.md) |哈希表 |简单|**哈希**|
276-
|[0589.N叉树的前序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0589.N叉树的前序遍历.md) ||简单|**递归****栈/迭代**|
278+
|[0589.N叉树的前序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0589.N叉树的前序遍历.md) ||简单|**递归** **栈/迭代**|
279+
|[0590.N叉树的后序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0590.N叉树的后序遍历.md) ||简单|**递归** **栈/迭代**|
277280
|[0617.合并二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0617.合并二叉树.md) ||简单|**递归** **迭代**|
278281
|[0637.二叉树的层平均值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0637.二叉树的层平均值.md) ||简单|**广度优先搜索/队列**|
279282
|[0654.最大二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0654.最大二叉树.md) ||中等|**递归**|

pics/102.二叉树的层序遍历.png

31.2 KB
Loading
Loading
33 KB
Loading

pics/199.二叉树的右视图.png

21.9 KB
Loading

pics/429. N叉树的层序遍历.png

30 KB
Loading

pics/637.二叉树的层平均值.png

36 KB
Loading

pics/我要打十个.gif

1.09 MB
Loading

problems/0102.二叉树的层序遍历.md

Lines changed: 207 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,41 @@
11
## 题目地址
22
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
33

4+
> 我要打十个!
5+
6+
看完这篇文章虽然不能打十个,但是可以迅速打五个!而且够快!
7+
8+
9+
# 102.二叉树的层序遍历
10+
11+
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
12+
13+
<img src='../pics/102.二叉树的层序遍历.png' width=600> </img></div>
14+
415
## 思路
516

6-
我们之前讲过了,二叉树的深度优先遍历:[一文学通二叉树前中后序递归法与迭代法](https://github.com/youngyangyang04/leetcode/blob/master/problems/0144.二叉树的前序遍历.md)里面有前中后序遍历的方式,前中后序分辨可以使用递归和迭代的方法来实现,接下来我们再来介绍二叉树的另一种遍历方式,也就是层序遍历。
17+
我们之前讲过了三篇关于二叉树的深度优先遍历的文章:
18+
19+
* [二叉树:前中后序递归法](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA)
20+
* [二叉树:前中后序迭代法](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg)
21+
* [二叉树:前中后序迭代方式统一写法](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)
722

8-
相似题目:
9-
* [0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md)
10-
* [0107.二叉树的层次遍历II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0107.二叉树的层次遍历II.md)
11-
* [0199.二叉树的右视图](https://github.com/youngyangyang04/leetcode/blob/master/problems/0199.二叉树的右视图.md)
12-
* [0637.二叉树的层平均值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0637.二叉树的层平均值.md)
23+
接下来我们再来介绍二叉树的另一种遍历方式:层序遍历。
1324

1425
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。
1526

16-
需要借用一个辅助数据结构队列来实现**队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。**
27+
需要借用一个辅助数据结构即队列来实现**队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。**
1728

18-
使用队列实现广度优先遍历,动画如下:
29+
**而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。**
1930

31+
使用队列实现二叉树广度优先遍历,动画如下:
32+
33+
![102二叉树的层序遍历.mp4](ad3d58a5-b8ee-42a5-bc89-6ad4d9e3cbf2)
2034
<video src='../video/102二叉树的层序遍历.mp4' controls='controls' width='640' height='320' autoplay='autoplay'> Your browser does not support the video tag.</video></div>
2135

2236
这样就实现了层序从左到右遍历二叉树。
2337

24-
代码如下:这份代码也可以作为二叉树层序遍历的模板。
38+
代码如下:**这份代码也可以作为二叉树层序遍历的模板,以后在打四个就靠它了**
2539

2640
## C++代码
2741

@@ -35,7 +49,8 @@ public:
3549
while (!que.empty()) {
3650
int size = que.size();
3751
vector<int> vec;
38-
for (int i = 0; i < size; i++) {// 这里一定要使用固定大小size,不要使用que.size()
52+
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
53+
for (int i = 0; i < size; i++) {
3954
TreeNode* node = que.front();
4055
que.pop();
4156
vec.push_back(node->val);
@@ -49,4 +64,186 @@ public:
4964
};
5065
```
5166

67+
**此时我们就掌握了二叉树的层序遍历了,那么如下四道leetcode上的题目,只需要修改模板的一两行代码(不能再多了),便可打倒!**
68+
69+
# 107.二叉树的层次遍历 II
70+
71+
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
72+
73+
<img src='../pics/107.二叉树的层次遍历II.png' width=600> </img></div>
74+
75+
## 思路
76+
77+
相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。
78+
79+
## C++代码
80+
81+
```
82+
class Solution {
83+
public:
84+
vector<vector<int>> levelOrderBottom(TreeNode* root) {
85+
queue<TreeNode*> que;
86+
if (root != NULL) que.push(root);
87+
vector<vector<int>> result;
88+
while (!que.empty()) {
89+
int size = que.size();
90+
vector<int> vec;
91+
for (int i = 0; i < size; i++) {
92+
TreeNode* node = que.front();
93+
que.pop();
94+
vec.push_back(node->val);
95+
if (node->left) que.push(node->left);
96+
if (node->right) que.push(node->right);
97+
}
98+
result.push_back(vec);
99+
}
100+
reverse(result.begin(), result.end()); // 在这里反转一下数组即可
101+
return result;
102+
103+
}
104+
};
105+
```
106+
107+
108+
# 199.二叉树的右视图
109+
110+
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
111+
112+
<img src='../pics/199.二叉树的右视图.png' width=600> </img></div>
113+
114+
## 思路
115+
116+
层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。
117+
118+
## C++代码
119+
120+
```
121+
class Solution {
122+
public:
123+
vector<int> rightSideView(TreeNode* root) {
124+
queue<TreeNode*> que;
125+
if (root != NULL) que.push(root);
126+
vector<int> result;
127+
while (!que.empty()) {
128+
int size = que.size();
129+
for (int i = 0; i < size; i++) {
130+
TreeNode* node = que.front();
131+
que.pop();
132+
if (i == (size - 1)) result.push_back(node->val); // 将每一层的最后元素放入result数组中
133+
if (node->left) que.push(node->left);
134+
if (node->right) que.push(node->right);
135+
}
136+
}
137+
return result;
138+
}
139+
};
140+
```
141+
142+
# 637.二叉树的层平均值
143+
144+
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
145+
146+
<img src='../pics/637.二叉树的层平均值.png' width=600> </img></div>
147+
148+
## 思路
149+
150+
本题就是层序遍历的时候把一层求个总和在取一个均值。
151+
152+
## C++代码
153+
154+
```
155+
class Solution {
156+
public:
157+
vector<double> averageOfLevels(TreeNode* root) {
158+
queue<TreeNode*> que;
159+
if (root != NULL) que.push(root);
160+
vector<double> result;
161+
while (!que.empty()) {
162+
int size = que.size();
163+
double sum = 0; // 统计每一层的和
164+
for (int i = 0; i < size; i++) {
165+
TreeNode* node = que.front();
166+
que.pop();
167+
sum += node->val;
168+
if (node->left) que.push(node->left);
169+
if (node->right) que.push(node->right);
170+
}
171+
result.push_back(sum / size); // 将每一层均值放进结果集
172+
}
173+
return result;
174+
}
175+
};
176+
177+
```
178+
179+
# 429.N叉树的层序遍历
180+
181+
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
182+
183+
例如,给定一个 3叉树 :
184+
185+
186+
<img src='../pics/429. N叉树的层序遍历.png' width=600> </img></div>
187+
188+
返回其层序遍历:
189+
190+
[
191+
[1],
192+
[3,2,4],
193+
[5,6]
194+
]
195+
196+
197+
## 思路
198+
199+
这道题依旧是模板题,只不过一个节点有多个孩子了
200+
201+
## C++代码
202+
203+
```
204+
class Solution {
205+
public:
206+
vector<vector<int>> levelOrder(Node* root) {
207+
queue<Node*> 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++) {
214+
Node* node = que.front();
215+
que.pop();
216+
vec.push_back(node->val);
217+
for (int i = 0; i < node->children.size(); i++) { // 将节点孩子加入队列
218+
if (node->children[i]) que.push(node->children[i]);
219+
}
220+
}
221+
result.push_back(vec);
222+
}
223+
return result;
224+
225+
}
226+
};
227+
```
228+
229+
# 总结
230+
231+
二叉树的层序遍历,就是图论中的广度优先搜索在二叉树中的应用,需要借助队列来实现(此时是不是又发现队列的应用了)。
232+
233+
学会二叉树的层序遍历,可以一口气撸完leetcode上五道题目:
234+
235+
* 102.二叉树的层序遍历
236+
* 107.二叉树的层次遍历II
237+
* 199.二叉树的右视图
238+
* 637.二叉树的层平均值
239+
* 589.N叉树的前序遍历
240+
241+
虽然不能一口气打十个,打五个也还行。
242+
243+
如果非要打十个,还得找叶师傅!
244+
245+
<img src='../pics/我要打十个.gif' width=600> </img></div>
246+
247+
248+
52249
> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# 链接
2+
3+
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
4+
5+
# 思路:
6+
7+
详细见
8+
[0106.从中序与后序遍历序列构造二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0106.从中序与后序遍历序列构造二叉树.md)

0 commit comments

Comments
 (0)