题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:利用辅助队列,并且设置一个layerSize变量用来记录当前层上元素的个数;
/*
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)
return res;
queue<TreeNode*> assistant;
int layerSize = 1;
assistant.push(pRoot);
while (!assistant.empty()) {
TreeNode* current;
vector<int> tmp;
for (int i = 0; i < layerSize; i++) {
current = assistant.front();
assistant.pop();
tmp.push_back(current->val);
if (current->left)
assistant.push(current->left);
if (current->right)
assistant.push(current->right);
}
res.push_back(tmp);
layerSize = assistant.size();
}
return res;
}
};
方法二:
利用递归,递归遍历每一层,然后将当前元素加入到其所在层的数组中,若所在层数组不存在,则先创建再加入。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
void LayerAdd(TreeNode* root, int depth, vector<vector<int> >& res) {
if(depth + 1 > res.size()){
vector<int> tmp;
res.push_back(tmp);
}
res[depth].push_back(root->val);
if (root->left)
LayerAdd(root->left, depth + 1, res);
if (root->right)
LayerAdd(root->right, depth + 1, res);
}
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if (!pRoot)
return res;
LayerAdd(pRoot, 0, res);
return res;
}
};