题目:
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}"
.
BFS In queue
Attention:队列辅助层序遍历,队列中插入NULL作为层与层之间的间隔,注意处理队列里最后的NULL时,不能再把它入队列以免形成死循环. 插入NULL前对队列是否非空的判断很重要(判断之后是否还有节点)。
AC Code:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
//输入二叉树的存储值(顺序存储,先层,再从左到右,没有的节点'#'表示);用广度搜索BFS求二叉树每层的值。
vector<int> level;
vector<vector<int>> ret;
if(root == NULL) return ret;
queue<TreeNode*> TreeQ;
TreeQ.push(root);
TreeQ.push(NULL); //用于区分每层
while(!TreeQ.empty())
{
TreeNode* tmp = TreeQ.front();
TreeQ.pop();
if(tmp != NULL)
{
level.push_back(tmp->val);
if(tmp->left) TreeQ.push(tmp->left);
if(tmp->right) TreeQ.push(tmp->right);
}
else
{
ret.push_back(level);
//只有队列非空时才做操作,避免对树的最后一个层分隔符做死循环
if(!TreeQ.empty())
{
level.clear();
TreeQ.push(NULL); //遍历完左右儿子的下一层子孙后再添加NULL
}
}
}
return ret;
}
};