Bird
Raised Fist0
DSA C++programming~20 mins

Tree Traversal Postorder Left Right Root in DSA C++ - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Postorder Traversal Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Postorder Traversal on a Simple Binary Tree
What is the output of the following C++ code that performs a postorder traversal (Left, Right, Root) on the given binary tree?
DSA C++
struct Node {
    int data;
    Node* left;
    Node* right;
    Node(int val) : data(val), left(nullptr), right(nullptr) {}
};

void postorder(Node* root) {
    if (!root) return;
    postorder(root->left);
    postorder(root->right);
    std::cout << root->data << " ";
}

int main() {
    Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->left = new Node(4);
    root->left->right = new Node(5);
    postorder(root);
    return 0;
}
A1 2 3 4 5
B4 5 2 3 1
C2 4 5 3 1
D4 2 5 3 1
Attempts:
2 left
💡 Hint
Remember postorder means visit left subtree, then right subtree, then the root node.
🧠 Conceptual
intermediate
1:00remaining
Number of Nodes Visited in Postorder Traversal
Given a binary tree with 7 nodes, how many nodes will be visited during a complete postorder traversal?
A8
B6
C7
DDepends on the tree structure
Attempts:
2 left
💡 Hint
Postorder traversal visits every node exactly once.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Postorder Traversal Code
What error will the following C++ code produce when performing postorder traversal?
DSA C++
struct Node {
    int data;
    Node* left;
    Node* right;
    Node(int val) : data(val), left(nullptr), right(nullptr) {}
};

void postorder(Node* root) {
    if (root == nullptr) return;
    postorder(root->right);
    postorder(root->left);
    std::cout << root->data << " ";
}

int main() {
    Node* root = new Node(10);
    root->left = new Node(20);
    root->right = new Node(30);
    postorder(root);
    return 0;
}
ACompilation error
B20 30 10
CNo output
D30 20 10
Attempts:
2 left
💡 Hint
Check the order of recursive calls for left and right children.
🚀 Application
advanced
2:30remaining
Postorder Traversal Output for Unbalanced Tree
What is the output of postorder traversal on this unbalanced tree? Tree structure: - Root: 5 - Root's right child: 8 - Node 8's left child: 6 - Node 6's right child: 7
DSA C++
struct Node {
    int data;
    Node* left;
    Node* right;
    Node(int val) : data(val), left(nullptr), right(nullptr) {}
};

void postorder(Node* root) {
    if (!root) return;
    postorder(root->left);
    postorder(root->right);
    std::cout << root->data << " ";
}

int main() {
    Node* root = new Node(5);
    root->right = new Node(8);
    root->right->left = new Node(6);
    root->right->left->right = new Node(7);
    postorder(root);
    return 0;
}
A7 6 8 5
B6 7 8 5
C5 8 6 7
D7 8 6 5
Attempts:
2 left
💡 Hint
Follow left, then right, then root order carefully for each subtree.
🧠 Conceptual
expert
3:00remaining
Postorder Traversal Stack Simulation Output
Given the iterative postorder traversal using two stacks on the tree below, what is the final printed output? Tree: - Root: 10 - Left child: 20 - Right child: 30 - Left child's left: 40 - Left child's right: 50
DSA C++
void postorderIterative(Node* root) {
    if (!root) return;
    std::stack<Node*> s1, s2;
    s1.push(root);
    while (!s1.empty()) {
        Node* curr = s1.top(); s1.pop();
        s2.push(curr);
        if (curr->left) s1.push(curr->left);
        if (curr->right) s1.push(curr->right);
    }
    while (!s2.empty()) {
        std::cout << s2.top()->data << " ";
        s2.pop();
    }
}

int main() {
    Node* root = new Node(10);
    root->left = new Node(20);
    root->right = new Node(30);
    root->left->left = new Node(40);
    root->left->right = new Node(50);
    postorderIterative(root);
    return 0;
}
A40 50 20 30 10
B10 20 30 40 50
C50 40 20 30 10
D20 40 50 30 10
Attempts:
2 left
💡 Hint
Two stacks reverse the order of a modified preorder traversal to get postorder.

Practice

(1/5)
1. What is the order of nodes visited in a postorder traversal of a binary tree?
easy
A. Left subtree, Right subtree, Root node
B. Root node, Left subtree, Right subtree
C. Root node, Right subtree, Left subtree
D. Right subtree, Left subtree, Root node

Solution

  1. Step 1: Understand postorder traversal definition

    Postorder traversal visits nodes in the order: left subtree first, then right subtree, and finally the root node.
  2. Step 2: Match the traversal order to options

    Left subtree, Right subtree, Root node correctly lists the order as Left, Right, Root which matches postorder traversal.
  3. Final Answer:

    Left subtree, Right subtree, Root node -> Option A
  4. Quick Check:

    Postorder = Left, Right, Root [OK]
Hint: Remember: postorder ends with root after children [OK]
Common Mistakes:
  • Confusing postorder with preorder or inorder
  • Swapping left and right subtree order
  • Thinking root is visited first
2. Which of the following C++ function signatures correctly represents a postorder traversal of a binary tree node Node*?
easy
A. void postorder(Node* root) { visit(root); postorder(root->left); postorder(root->right); }
B. void postorder(Node* root) { postorder(root->right); postorder(root->left); visit(root); }
C. void postorder(Node* root) { postorder(root->right); visit(root); postorder(root->left); }
D. void postorder(Node* root) { postorder(root->left); postorder(root->right); visit(root); }

Solution

  1. Step 1: Recall postorder traversal steps

    Postorder visits left subtree, then right subtree, then root node.
  2. Step 2: Check function calls order

    void postorder(Node* root) { postorder(root->left); postorder(root->right); visit(root); } calls postorder on left, then right, then visits root, matching postorder traversal.
  3. Final Answer:

    void postorder(Node* root) { postorder(root->left); postorder(root->right); visit(root); } -> Option D
  4. Quick Check:

    Left, Right, Root call order = void postorder(Node* root) { postorder(root->left); postorder(root->right); visit(root); } [OK]
Hint: Postorder calls left, then right, then root visit [OK]
Common Mistakes:
  • Visiting root before children (preorder)
  • Swapping left and right subtree calls
  • Missing visit call after recursion
3. Given the binary tree:
    1
   / \
  2   3
 / \
4   5

What is the output of a postorder traversal?
medium
A. [1, 2, 3, 4, 5]
B. [4, 2, 5, 3, 1]
C. [4, 5, 2, 3, 1]
D. [2, 4, 5, 3, 1]

Solution

  1. Step 1: Traverse left subtree of root (1)

    Left subtree rooted at 2: postorder visits 4, then 5, then 2.
  2. Step 2: Traverse right subtree and root

    Right subtree is 3 alone, visited next. Finally, root 1 is visited.
  3. Final Answer:

    [4, 5, 2, 3, 1] -> Option C
  4. Quick Check:

    Postorder = Left, Right, Root = [4,5,2,3,1] [OK]
Hint: Visit children fully before root [OK]
Common Mistakes:
  • Listing root before children
  • Mixing left and right subtree order
  • Confusing with preorder or inorder output
4. The following C++ code attempts postorder traversal but produces incorrect output. What is the error?
void postorder(Node* root) {
  if (!root) return;
  postorder(root->right);
  postorder(root->left);
  visit(root);
}
medium
A. Left and right subtree calls are swapped
B. The base case check is incorrect
C. The visit call is missing
D. The function should visit root before children

Solution

  1. Step 1: Analyze recursive calls order

    The code calls postorder on right subtree first, then left subtree, which reverses the correct order.
  2. Step 2: Understand correct postorder order

    Postorder requires left subtree first, then right subtree, then root visit.
  3. Final Answer:

    Left and right subtree calls are swapped -> Option A
  4. Quick Check:

    Left before right in postorder [OK]
Hint: Left subtree call must come before right [OK]
Common Mistakes:
  • Swapping left and right subtree calls
  • Visiting root before children
  • Omitting base case check
5. You want to collect all node values of a binary tree in postorder traversal into a vector. Which code snippet correctly implements this in C++?
hard
A. void postorder(Node* root, vector<int>& res) { if (!root) return; res.push_back(root->val); postorder(root->left, res); postorder(root->right, res); }
B. void postorder(Node* root, vector<int>& res) { if (!root) return; postorder(root->left, res); postorder(root->right, res); res.push_back(root->val); }
C. void postorder(Node* root, vector<int>& res) { if (!root) return; postorder(root->right, res); postorder(root->left, res); res.push_back(root->val); }
D. void postorder(Node* root, vector<int>& res) { if (!root) return; postorder(root->left, res); res.push_back(root->val); postorder(root->right, res); }

Solution

  1. Step 1: Confirm traversal order in code

    void postorder(Node* root, vector<int>& res) { if (!root) return; postorder(root->left, res); postorder(root->right, res); res.push_back(root->val); } calls postorder on left, then right subtree, then adds root value to vector, matching postorder.
  2. Step 2: Check other options for order mistakes

    The other options either add the root value too early or swap left and right calls, breaking postorder.
  3. Final Answer:

    void postorder(Node* root, vector<int>& res) { if (!root) return; postorder(root->left, res); postorder(root->right, res); res.push_back(root->val); } -> Option B
  4. Quick Check:

    Left, Right, Root push_back order = void postorder(Node* root, vector<int>& res) { if (!root) return; postorder(root->left, res); postorder(root->right, res); res.push_back(root->val); } [OK]
Hint: Push root value after left and right recursion [OK]
Common Mistakes:
  • Pushing root value before children
  • Swapping left and right subtree calls
  • Forgetting to check for null root
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard