题解 | #从上往下打印二叉树#
从上往下打印二叉树
http://www.nowcoder.com/practice/7fe2212963db4790b57431d9ed259701
二叉树的层序遍历,较为基础。
首先用一个二维数组将不同层的结点分开保存,然后将该二维数组的数依次输入到结果数组中即可。
遍历过程中使用一个level变量来传递层数信息。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> result;
if(!root){
return result;
}
vector<vector<int>> arr;
go(root, arr, 0);
for(int i = 0;i<arr.size();i++){
for(int j = 0;j<arr.at(i).size();j++){
result.push_back(arr.at(i).at(j));
}
}
return result;
}
void go(TreeNode* p, vector<vector<int>> &v, int level){
if(v.size() == level){
vector<int> py;
v.push_back(py);
}
v.at(level).push_back(p->val);
if(p->left){
go(p->left, v, 1 + level);
}
if(p->right){
go(p->right, v, 1 + level);
}
}
};
上面这种解法实际是因为刚做了一道类似的层序遍历的题目,题中要求将不同层的数放在不同数组中返回。惯性思维使用了这种解法,而实际上常规的层序遍历做法应该使用队列。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> r;
if(!root){
return r;
}
queue<TreeNode*> q;
TreeNode* p = root;
q.push(p);
while(q.size()){
TreeNode* t = q.front();
q.pop();
r.push_back(t->val);
if(t->left){
q.push(t->left);
}
if(t->right){
q.push(t->right);
}
}
return r;
}
};