4. Post-Order

left --> right --> root
// Recursive
private void TraverseTree (Node root) {
TraverseTree(Node.left);
TraverseTree(Node.right);
System.out.println(root.data);
}
// Helper Function
void dfs(TreeNode* root, vector<int>& ans) {
if (!root) return;
dfs(root->left, ans);
dfs(root->right, ans);
ans.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
dfs(root, ans);
return ans;
}
// Iterative
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> st;
TreeNode* curr = root;
TreeNode* lastVisited = nullptr;
while (curr || !st.empty()) {
while (curr) {
st.push(curr);
curr = curr->left;
}
TreeNode* node = st.top();
if (node->right && lastVisited != node->right) {
curr = node->right;
}
else {
ans.push_back(node->val);
lastVisited = node;
st.pop();
}
}
return ans;
}