第十六题 前面之字形的简单版本 利用队列的层序遍历
/*
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> ans;
        // 边界问题
        if(root == NULL)
            return ans;
        
        // 用于层次遍历 保存后续结点的队列
        queue<TreeNode *> p;
        // 第一次先把根节点放进去
        p.push(root);
        
        // 层次遍历 如果队列不是空,则继续往下遍历
        while( !p.empty() ){
            // 相比之字形 每层都需要其他处理 要计算每一层有多少个结点 这里不需要
            // 弹出队列首个结点
            TreeNode* thisnode = p.front();
            p.pop();
            
            // 将该结点的值 保存到ans中
            ans.push_back(thisnode->val);
            
            // 将该结点的左右结点保存到队列 让他后面可以继续向下面的层访问
            if(thisnode->left!=NULL)
                p.push(thisnode->left);
            if(thisnode->right!=NULL)
                p.push(thisnode->right);
        }
        return ans;
    }
};