二叉樹的前中後序遍歷都做完了,現在就到層級遍歷了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;
}
做完這道題,看了一下題解,裏面有兩種方法,一種跟我這個差不多,另外一種用到了遞歸,感覺高級很多,怎麼當時我就沒想到呢?!還需努力!