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;
}
        看了一下网上一些方法,好像要设置标志位,看是否是访问过的结点,感觉我这种方法感觉好理解一点啊。不过,花费的空间自然就多了。

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