层序遍历很简单,这个题的主要难点在于按层去存取,你可以深搜,用一个标记值记录每层的层数,
另外这里有个在空的vector<vector<int>>中存入一个vector<int>的用法之前不会用,挺好用的,
递归代码:
/**
* Definition for binary tree
* 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>> v;
if(!root)
return v;
dfs(root,1,v);
return v;
}
void dfs(TreeNode *root,int level,vector<vector<int>> &v){
if(!root) return;
if(level>v.size())
v.push_back(vector<int>());
v[level-1].push_back(root->val);
if(root->left)
dfs(root->left,level+1,v);
if(root->right)
dfs(root->right,level+1,v);
}
}
也可以不用递归,不用递归的话,这里的技巧主要在于开俩个队列,把当前队列逐个出列然后入vector,同时
把后面一列加入另外一个队列,当前队列全部出列后,把当前队列与下层队列交换值。
代码:
/**
* Definition for binary tree
* 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>> v;
if(!root)
return v;
vector<int> res;
queue<TreeNode*> current,next;
current.push(root);
while(!current.empty()){
while(!current.empty()){
TreeNode *tem=current.front();
current.pop();
res.push_back(tem->val);
if(tem->left)
next.push(tem->left);
if(tem->right)
next.push(tem->right);
}
swap(current,next);
v.push_back(res);
res.clear();
}
return v;
}
};