二叉树的前中后序遍历都做完了,现在就到层级遍历了Binary Tree Level Order Traversal,题目描述如下:
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.
这里面的层级输出跟我们在书上看到的还不太一样,如果是直接输出的话,直接一个用一个队列保存结点,然后遍历队列,将出队列的结点的左右儿子结点继续进队列,循环直到队列为空就好。但是现在每层还要单独分出来。一开始我是想着根据二叉树的性质,每层有多少个元素然后看结点在队列中是第几个,那么满足一定条件就要换一层去存储。但是用数据模拟了一下,感觉还挺麻烦的,中间有些结点过早结束怎么办(即不是完全二叉树的时候)?纠结了好一会儿,想到,能不能再搞一个队列,先把现在这一层的结点放在第一个队列中,然后遍历队列1,将其儿子结点放在队列2中,当队列1为空的时候,那么就说明这一层结束了,准备进入下一层了。按照这个思路,代码如下:
std::vector<std::vector<int> > levelOrder(TreeNode *root)
{
std::vector<std::vector<int> > result;
std::vector<int> temp;
std::queue<TreeNode *> treeQueue1,treeQueue2;
if (!root)
{
return result;
}
treeQueue1.push(root);
TreeNode *node = NULL;
while(!treeQueue1.empty() || !treeQueue2.empty())
{
if (!treeQueue1.empty())
{
node = treeQueue1.front();
treeQueue1.pop();
if (node->left)
{
treeQueue2.push(node->left);
}
if (node->right)
{
treeQueue2.push(node->right);
}
temp.push_back(node->val);
}
if (treeQueue1.empty())
{
//this means that this level is over
result.push_back(temp);
temp.clear();
treeQueue1.swap(treeQueue2); //swap two queue
}
}
return result;
}
做完这道题,看了一下题解,里面有两种方法,一种跟我这个差不多,另外一种用到了递归,感觉高级很多,怎么当时我就没想到呢?!还需努力!