经典问题:广度优先遍历 用队列。 特点在于要分层输出。每层遍历完后向队列中压入nullptr.
出队时遇到nullptr说明当前层已经遍历完,再向队列中压入nullptr。 初始化是压入root,nullptr到队列中。
需要注意:出队时遇到Nullptr时,如果队列已经为空,说明已经遍历完成,不要再加入nullptr了,不然死循环了。

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */
#include <queue>
class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int> >  ans;
        if(root == nullptr){
            return ans;
        }
        queue<TreeNode*> Q;
        Q.push(root);
        Q.push(nullptr);
        vector<int> cur;
        while(!Q.empty()){
            auto *top  = Q.front();
            Q.pop();
            if(top == nullptr){       //遇到nullptr,当前层结束
                ans.push_back(cur);
                cur.clear();
                if(Q.empty()){        //队列已经空了,直接跳出
                    break;
                }else{
                    Q.push(nullptr); //队列不空,压入层标记nullptr
                }
                continue;
            }
            cur.push_back(top->val); 
            if(top->left){
                Q.push(top->left);
            }
            if(top->right){
                Q.push(top->right);
            }
        }
        return ans;
    }
};