145. Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes’ values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [3,2,1]
方法0: recursion
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
root = postorderHelper(root, result);
return result;
}
TreeNode* postorderHelper(TreeNode* root, vector<int>& result){
if (root == nullptr) return nullptr;
postorderHelper(root->left, result);
postorderHelper(root->right, result);
result.push_back(root->val);
return root;
}
};
方法1: iterative
思路:
注意上图,postorder!=reverse(preorder):左右顺序有变化。因此在preorder的基础上修改,将preorder入栈的左右序交换,最后用另一个栈反转一次。
易错点:
- 左右顺序
Complexity
Time complexity : we visit each node exactly once, thus the time complexity is O(N), where NN is the number of nodes, i.e. the size of tree.
Space complexity : depending on the tree structure, we could keep up to the entire tree, therefore, the space complexity is O(N).
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if (!root) return result;
stack<TreeNode*> st1;
stack<TreeNode*> st2;
st1.push(root);
while (!st1.empty()){
auto top = st1.top();
st1.pop();
st2.push(top);
if (top -> left) {
st1.push(top -> left);
}
if (top -> right) {
st1.push(top -> right);
}
}
while (!st2.empty()){
auto top = st2.top();
st2.pop();
result.push_back(top -> val);
}
return result;
}
};