leetcode 虐我篇之(十七)Binary Tree Level Order Traversal

        二叉樹的前中後序遍歷都做完了,現在就到層級遍歷了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;
}

        做完這道題,看了一下題解,裏面有兩種方法,一種跟我這個差不多,另外一種用到了遞歸,感覺高級很多,怎麼當時我就沒想到呢?!還需努力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章