经典问题:广度优先遍历 用队列。 特点在于要分层输出。每层遍历完后向队列中压入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; } };