既然前面做完了二叉樹的非遞歸前序、中序遍歷,自然地就輪到這題了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;
}
看了一下網上一些方法,好像要設置標誌位,看是否是訪問過的結點,感覺我這種方法感覺好理解一點啊。不過,花費的空間自然就多了。