RT,二叉树的层序遍历

今天上午刷LeetCode心态崩了,啥题都写不出来,索性来写博客,记录一下做过的题。

题目链接

LeetCode102.二叉树的层序遍历

题目描述

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)

示例:二叉树:[3,9,20,null,null,15,7],

返回其层次遍历结果:[[3], [9,20], [15,7]]

题目解析

在这道题之前我曾经做过二叉树的前中后序遍历等问题,于是一上来想到的就是各种递归的方法,但是百思不得其解。查看答案才发现自己一开始的思路就错了,原来层序遍历与前中后序遍历使用了完全不一样的方法。

这道题中我们运用了 广度优先遍历(BFS) 的方法来解决问题,每次遍历二叉树中一层的元素,然后再接着遍历下一层。

要解决这个问题我们需要用到队列这一数据结构,由于队列具有先入先出的性质,我们每次将遍历到的一层节点压入队列,然后对这些节点进行处理,将这一层节点的子节点压入队列,然后让这一层的节点出队列,再接着处理下一层的节点。

另外一个让我思考的点是,如何在输出的数组中,确定同一层的节点个数。这一问题比较好解决,因为在将一层的节点全部压入队列并处理之前,已经将上一层的节点全部弹出,所以可以在处理每层节点之前先计算这层节点的数量,然后用这个数量值作为限制处理该层的节点就可以了。

代码

使用了两种方法来写代码,一种似乎是参考答案写的,每一层直接进行处理,另一种是我第二次复习时候写的,在处理每一层时新建了一个vector存储每一层的节点,然后再处理结束后将vector加入到答案vector中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>result;
if(!root)return result;
queue<TreeNode*>q;
q.push(root);
while(!q.empty()){
result.push_back(vector<int>());
int size=q.size();
for(int i=0; i<size; i++){
TreeNode* node=q.front();
result.back().push_back(node->val);
if(node->left)q.push(node->left);
if(node->right)q.push(node->right);
q.pop();
}
}
return result;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>result;
if(!root)return result;
queue<TreeNode*>q;
q.push(root);
while(!q.empty()){
vector<int>level;
int size=q.size();
for(int i=0; i<size; i++){
level.push_back(q.front()->val);
if(q.front()->left)q.push(q.front()->left);
if(q.front()->right)q.push(q.front()->right);
q.pop();
}
result.push_back(level);
}
return result;
}
};

总结

二叉树的层序遍历作为广度优先遍历的基础,让我理解了bfs这一算法的基本框架,后面还需要再好好学习一下这一方面,毕竟都忘得差不多了。

评论