二叉树的层序遍历,较为基础。
首先用一个二维数组将不同层的结点分开保存,然后将该二维数组的数依次输入到结果数组中即可。
遍历过程中使用一个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;
    }
};