leetcode 虐我篇之(十六)Binary Tree Postorder Traversal

        既然前面做完了二叉樹的非遞歸前序、中序遍歷,自然地就輪到這題了Binary Tree Postorder Traversal,題目描述如下:

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},
   1
    \
     2
    /
   3
return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?
        同樣地,這裏用迭代的方法,同樣用棧結構去存儲。這裏面我想了好一會兒,覺得用一個棧的話,感覺還不太好弄,如果有兩個棧的話,就非常方便了。所以我定義了兩個棧,其中一個是存最後結果的棧treeStack,另一個是用來做中間存儲的,專門存儲左結點的棧leftStack。現將根結點入棧treeStack,然後將左結點入棧leftStack,接着,把右結點當做根結點做剛纔相同的入棧操作,如果右結點爲NULL,則從左結點的棧中出棧,將其作爲根結點,作相同的入棧工作。當所有的結點都入棧treeStack後,再將treeStack一個個出棧就好了。代碼如下:
std::vector<int> inorderTraversal(TreeN</span>ode *root)
{
	std::vector<int> result;
	std::stack<TreeNode *> treeStack,leftStack;	//two stack,leftStack is to save left child

	if (!root)
	{
		return result;
	}

	TreeNode *node = root;

	while(node || !leftStack.empty())
	{
		treeStack.push(node);	//root node push into the stack

		if (node->left)
		{
			leftStack.push(node->left);	//left child push into the leftStack
		}

		//
		if (node->right)
		{
			node = node->right;
		}
		else
		{
			if (!leftStack.empty())
			{
				node = leftStack.top();
				leftStack.pop();
			}
			else
			{
				node = NULL;
			}
			
		}
	}

	while(!treeStack.empty())
	{
		node = treeStack.top();
		result.push_back(node->val);
		treeStack.pop();
	}

	return result;
}
        看了一下網上一些方法,好像要設置標誌位,看是否是訪問過的結點,感覺我這種方法感覺好理解一點啊。不過,花費的空間自然就多了。

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