1.题目
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2.Code
(1)解法1:继承上1个题的思路
这个题和“之”字形打印的思路一样的,只不过是顺序都保持了一致(先进先出),则可以将stack
换做queue
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector< vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
queue<TreeNode*> q1;
queue<TreeNode*> q2;
if(pRoot == NULL) return res;
q1.push(pRoot);
while(!q1.empty() || !q2.empty()){
std::vector<int> vemp1;
std::vector<int> vemp2;
while(!q1.empty()){
vemp1.push_back(q1.front()->val);
if(q1.front()->left)
q2.push(q1.front()->left);
if(q1.front()->right)
q2.push(q1.front()->right);
q1.pop();
}
if(!vemp1.empty())
res.push_back(vemp1);
while(!q2.empty())
{
vemp2.push_back(q2.front()->val);
if(q2.front()->left)
q1.push(q2.front()->left);
if(q2.front()->right)
q1.push(q2.front()->right);
q2.pop();
}
if(!vemp2.empty())
res.push_back(vemp2);
}
return res;
}
};
(2) 剑指offer书上给的解法:
个人觉得应该是比解法1少开辟一些空间
添加2个变量来控制是否当前层已经打印完毕
(1)变量1用于表示当前层中还没有打印的节点数
(2)变量2用于表示下一层的节点数
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
std::vector<vector<int>> res;
if(pRoot == NULL) return res;
queue<TreeNode*> q;
q.push(pRoot);
int current_level = 1;
int next_level = 0;
std::vector<int> vemp;
while(!q.empty())
{
vemp.push_back(q.front()->val);
if(q.front()->left){
q.push(q.front()->left);
next_level++;
}
if(q.front()->right){
q.push(q.front()->right);
next_level++;
}
current_level--;
if(current_level == 0)
{
if(!vemp.empty()){
res.push_back(vemp);
vemp.clear(); //一定清空便于下次使用
}
current_level = next_level;
next_level = 0;
}
q.pop();
}
return res;
}
};