题目描述
【leetcode】102. 二叉树的层次遍历( Binary Tree Level Order Traversal )
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
第一次解答
思路
遍历很简单,BFS。问题是怎么知道什么时候对数据切分为一个vector?
根据题意知道,每一层分为一个小的vector,我采用的方法是额外给一个数字,记录每个结点在第几层。当遇到下一层时表示上一层元素已经遍历完,把数据切分为一个vector
注意当遍历完最后一次时,还需要在循环外面切分一次数据
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#include <queue>
#include <utility>
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(nullptr == root){
return result;
}
queue<pair<TreeNode*, int>> traversal_order;
traversal_order.push(make_pair(root, 0));
int count = 0;
vector<int> level_result;
while(!traversal_order.empty()){
pair<TreeNode*, int> curr = traversal_order.front();
traversal_order.pop();
if(curr.second > count){
count++;
result.push_back(level_result);
level_result.clear();
}
level_result.push_back(curr.first->val);
if(nullptr != curr.first->left){
traversal_order.push(make_pair(curr.first->left, curr.second+1));
}
if(nullptr != curr.first->right){
traversal_order.push(make_pair(curr.first->right, curr.second+1));
}
}
result.push_back(level_result);
return result;
}
};
结果:
第二次解答
思路
实际上我不需要额外的数字记录结点在第几层。在将当前层遍历完成后,进行下一次遍历前,队列里的元素就是二叉树下一层所有元素。我们在遍历前记录元素个数,就知道在遍历多少个元素后进行数据切分为一个小的vector了。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#include <queue>
#include <utility>
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(nullptr == root){
return result;
}
// TODO: Write your code here
queue<TreeNode*> traversal_order;
traversal_order.push(root);
int number_per_level = traversal_order.size();
vector<int> level_result;
level_result.reserve(number_per_level);
while(!traversal_order.empty()){
TreeNode *p_curr = traversal_order.front();
level_result.push_back(p_curr->val);
if(nullptr != p_curr->left){
traversal_order.push(p_curr->left);
}
if(nullptr != p_curr->right){
traversal_order.push(p_curr->right);
}
traversal_order.pop();
number_per_level--;
if(number_per_level <= 0){
number_per_level = traversal_order.size();
result.push_back(level_result);
level_result.clear();
level_result.reserve(number_per_level);
}
}
return result;
}
};
结果:
第三次解答
优化解答2的代码,使得更好理解。
代码:
#include <queue>
#include <utility>
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(nullptr == root){
return result;
}
queue<TreeNode*> traversal_order;
traversal_order.push(root);
while(!traversal_order.empty()){
int number_per_level = traversal_order.size();
vector<int> level_result;
level_result.reserve(number_per_level);
for(int i=0; i<number_per_level; ++i){
TreeNode *p_curr = traversal_order.front();
level_result.push_back(p_curr->val);
traversal_order.pop();
if(nullptr != p_curr->left){
traversal_order.push(p_curr->left);
}
if(nullptr != p_curr->right){
traversal_order.push(p_curr->right);
}
}
result.push_back(level_result);
}
return result;
}
};
结果: