4. Post-Order

POSTORDER.gif579

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;
}
Powered by Forestry.md