原题目:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
思路1:
用队列进行BFS。并用结构体node保存节点和深度。当深度不同时进行更新。
注意最后一次的判断,如果temp不为空(说明最后一次还有元素),同样进行更新
代码1:
class Solution {
private:
struct node{
TreeNode* r;
int deep;
};
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(!root) return res;
vector<int> temp;
queue<node> q;
int depth = 1;
node t = {root,1};
q.push(t);
while(!q.empty()){
node f = q.front();
if(f.deep==depth)
temp.push_back(f.r->val);
else{
res.push_back(temp);
temp.resize(0);
temp.push_back(f.r->val);
depth++;
}
q.pop();
if(f.r->left){
q.push(node {f.r->left,f.deep+1});
}
if(f.r->right){
q.push(node {f.r->right,f.deep+1});
}
}
if(temp.size()) res.push_back(temp);
return res;
}
};
思路二:每一次记录队列的长度,这个值就是同一层元素的个数,然后while循环加一个for循环,把该层的val加进去。
代码:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret;
if (!root) return ret;
queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return ret;
}
};