题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路一:
利用层次遍历二叉树的方式,用一个队列进行辅助,每次打印前取n = q.size(),可以保证逐行打印。
代码一:
/*
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;
if(pRoot == NULL) return res;
queue<TreeNode*> q;
q.push(pRoot);
vector<int> raw;
TreeNode* tmpNode;
while(!q.empty()) {
int n = q.size();
for(int i = 0; i < n; ++i) {
tmpNode = q.front();
q.pop();
raw.push_back(tmpNode->val);
if(tmpNode->left) q.push(tmpNode->left);
if(tmpNode->right) q.push(tmpNode->right);
}
res.push_back(raw);
raw.clear();
}
return res;
}
};
思路二:
与前一题的思路相同,上一题采用两个辅助栈,这一题可以采用两个辅助队列,每次队列入队都是先左孩子结点后右孩子结点,即可保证树的层次遍历输出。
代码二:
/*
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;
if(pRoot == NULL) return res;
queue<TreeNode*> q[2];
q[0].push(pRoot);
int cur = 0;
int next = 1;
TreeNode* tmpNode;
vector<int> raw;
while(!q[0].empty() || !q[1].empty()) {
while(!q[cur].empty()) {
tmpNode = q[cur].front();
q[cur].pop();
raw.push_back(tmpNode->val);
if(tmpNode->left) q[next].push(tmpNode->left);
if(tmpNode->right) q[next].push(tmpNode->right);
}
res.push_back(raw);
raw.clear();
cur = 1 - cur;
next = 1 - next;
}
return res;
}
};