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?:
題意
通過題目所給的樹,求出其後根遍歷,並將結點的val值壓入vector中,建議用通過非遞歸方式實現
解題思路
通過棧去模擬遞歸,首先要明確後根遍歷,必須先遍歷完左子樹與右子樹之後,才訪問根節點。當前遍歷的節點分有子樹和沒子樹兩種,沒子樹自然直接可以加入vector中,而有的呢,有一種處理方法,將後根遍歷的前一個節點保存起來,若此節點不是當前遍歷節點的左右子樹,證明當前節點左右子樹還沒被訪問到。
爲此我們可以分3種情況
1.棧頂的節點沒有左右子樹,證明此節點可以直接訪問,就讓此節點出棧,並將其的val值放入vector容器中,並將其值設爲前驅節點的值
2.棧頂節點有左右子樹,判斷當前前驅節點是否爲棧頂節點左右子樹,是的話便可以出棧,並將其的val值放入vector容器中,並將其值設爲前驅節點的值
3.棧頂的節點有左右子樹,且不滿足上述2條件,我們依次將右子樹,左子樹壓入棧中(這樣便可以保證,在遍歷到根節點時,總能先訪問到左子樹,右子樹)
AC代碼
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> v;
if(root==NULL)
return v;
stack<TreeNode *> sta;
TreeNode *pre =NULL; //前驅遍歷頂點
sta.push(root);
while(!sta.empty())
{
TreeNode *tmp = sta.top();
if((tmp->left==NULL&&tmp->right==NULL)||(pre!=NULL&&(tmp->left==pre||tmp->right==pre)))
{
v.push_back(tmp->val);
sta.pop();
pre = tmp;
}
else
{
if(tmp->right!=NULL)
sta.push(tmp->right);
if(tmp->left!=NULL)
sta.push(tmp->left);
}
}
return v;
}
};