題目鏈接: https://leetcode.com/problems/binary-tree-postorder-traversal/description/
Description
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?
解題思路
遞歸的方式很簡單,但是這道題要求用非遞歸的方式,那麼自然想到的就是用棧來解決。由於後序遍歷的順序是 左節點->右節點->根
,所以可以先一直沿着左節點往下直到NULL
,將這條路徑上的所有節點依次放入棧(nStack)中。同時用另一個棧(vStack),爲每一個節點保存狀態值,用於彈出棧頂時以辨別是否遍歷過其右節點,初始值爲false
。若已經遍歷過其右節點,則同時彈出兩個棧的棧頂,並將該節點的值存入返回數組中;若未遍歷其右節點,則暫時不彈出,修改 vStack 的棧頂爲true
,表示已訪問過其右節點,並與之前一樣,此時的根節點應爲該節點的右節點,沿着新的根節點的左節點一直遍歷至NULL
,重複該過程。
Code
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> nStack;
stack<bool> vStack;
while (root != NULL) {
nStack.push(root);
vStack.push(false);
root = root->left;
}
while (!nStack.empty()) {
root = nStack.top();
if (vStack.top()) {
res.push_back(root->val);
nStack.pop();
vStack.pop();
} else {
vStack.top() = true;
root = root->right;
while (root != NULL) {
nStack.push(root);
vStack.push(false);
root = root->left;
}
}
}
return res;
}
};