https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
第一想法是用俩队列,每个队列保存一层的值,循环直到俩队列为空。
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q1;
queue<TreeNode*> q2;
vector<vector<int>> retv;
vector<int> v1; //记录每一层的vector
if(root!=nullptr)
q1.push(root);
while (!q1.empty() || !q2.empty()) {
while (!q1.empty()) {
TreeNode* p = q1.front();
v1.push_back(p->val);
q1.pop();
if (p->left!=nullptr)
q2.push(p->left);
if (p->right!=nullptr)
q2.push(p->right);
}
if(!v1.empty())
retv.push_back(v1);
v1.clear();
while (!q2.empty()) {
TreeNode* p = q2.front();
v1.push_back(p->val);
q2.pop();
if (p->left)
q1.push(p->left);
if (p->right)
q1.push(p->right);
}
if(!v1.empty())
retv.push_back(v1);
v1.clear();
}
return retv;
}
代码总感觉写的太low,太长,应该还能优化。后来就想了一下用一个队列似乎也能完成,只需记录下当前层数有几个节点,然后依次对这几个节点遍历并出队,将他们的左右节点入队开始下一轮循环。
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
vector<vector<int>> retv;
if(root==nullptr)
return retv;
vector<int> v1;
q.push(root);
while(!q.empty()){
int num = q.size(); //当前层有多少节点
for(int i=0;i<num;++i){ //遍历当前层 同时将下一层节点放入
TreeNode* p =q.front();
v1.push_back(p->val);
q.pop();
if(p->left!=nullptr)
q.push(p->left);
if(p->right!=nullptr)
q.push(p->right);
}
if(!v1.empty())
retv.push_back(v1);
v1.clear();
}
return retv;
}