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?
思路:
对于任一节点P,
1)先将节点P入栈;
2)若P不存在左孩子和右孩子,或者P存在左孩子或右孩子,但左右孩子已经被输出,则可以直接输出节点P,并将其出栈,将出栈节点P标记为上一个输出的节点,再将此时的栈顶结点设为当前节点;
3)若不满足2)中的条件,则将P的右孩子和左孩子依次入栈,当前节点重新置为栈顶结点,之后重复操作2);
4)直到栈空,遍历结束。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if (!root) return vector<int>();
vector<int> res;
stack<TreeNode*> stk;
stk.push(root);
TreeNode* cur;
TreeNode* pre = nullptr;
while (!stk.empty()){
cur = stk.top();
if ((!cur->left&&!cur->right) || ((pre) && (cur->left == pre || cur->right == pre))){
stk.pop();
res.push_back(cur->val);
pre = cur;
}
else{
if (cur->right){
stk.push(cur->right);
}
if (cur->left){
stk.push(cur->left);
}
}
}
return res;
}
};