Bird
Raised Fist0
DSA C++programming

Tree Traversal Preorder Root Left Right in DSA C++

Choose your learning style10 modes available
Mental Model
Visit the root node first, then explore the left subtree, and finally the right subtree. This order helps you see the tree starting from the top and going down left before right.
Analogy: Imagine reading a family tree starting from the oldest ancestor (root), then looking at their left child and all descendants, before moving to the right child and their descendants.
    1
   / \
  2   3
 / \
4   5

↑ Root at 1
Dry Run Walkthrough
Input: Tree: 1 as root, 2 as left child, 3 as right child, 4 as left child of 2, 5 as right child of 2
Goal: Print nodes in preorder: root first, then left subtree, then right subtree
Step 1: Visit root node 1
Output: 1
Why: Start traversal at the root node
Step 2: Traverse left subtree starting at node 2
Output: 1 2
Why: After root, preorder visits left subtree
Step 3: Visit left child of 2, node 4
Output: 1 2 4
Why: Preorder visits root of left subtree before its children
Step 4: Back to node 2, visit right child 5
Output: 1 2 4 5
Why: After left child, visit right child in left subtree
Step 5: Traverse right subtree starting at node 3
Output: 1 2 4 5 3
Why: After left subtree, preorder visits right subtree
Result:
Output: 1 2 4 5 3
Annotated Code
DSA C++
#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* left;
    Node* right;
    Node(int val) : data(val), left(nullptr), right(nullptr) {}
};

void preorderTraversal(Node* root) {
    if (root == nullptr) return; // base case: no node
    cout << root->data << " "; // visit root first
    preorderTraversal(root->left); // then traverse left subtree
    preorderTraversal(root->right); // finally traverse right subtree
}

int main() {
    // build tree
    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);

    preorderTraversal(root);
    cout << endl;
    return 0;
}
if (root == nullptr) return; // base case: no node
stop recursion when no node to visit
cout << root->data << " "; // visit root first
visit current node before children
preorderTraversal(root->left); // then traverse left subtree
recursively visit left subtree
preorderTraversal(root->right); // finally traverse right subtree
recursively visit right subtree
OutputSuccess
1 2 4 5 3
Complexity Analysis
Time: O(n) because each node is visited exactly once
Space: O(h) where h is tree height due to recursion stack
vs Alternative: Compared to inorder or postorder, preorder visits root first which is useful for copying or prefix expressions
Edge Cases
Empty tree (root is nullptr)
No output, function returns immediately
DSA C++
if (root == nullptr) return; // base case: no node
Single node tree
Only root node is printed
DSA C++
if (root == nullptr) return; // base case: no node
Tree with only left children
Nodes printed top to bottom along left side
DSA C++
preorderTraversal(root->left); // then traverse left subtree
When to Use This Pattern
When you need to process the root before its children, such as copying a tree or prefix expression evaluation, use preorder traversal.
Common Mistakes
Mistake: Visiting left or right child before the root node
Fix: Print the root node's data before recursive calls to children
Mistake: Not checking for nullptr before recursion causing crashes
Fix: Add base case to return immediately if node is nullptr
Summary
Visits the root node first, then left subtree, then right subtree.
Use when you want to process the root before its children, like copying or prefix operations.
Remember: root first, then left, then right.

Practice

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

Solution

  1. Step 1: Understand preorder traversal definition

    Preorder traversal visits the root node first, then the left subtree, and finally the right subtree.
  2. Step 2: Match the order with options

    Root, Left, Right matches the order Root, Left, Right exactly.
  3. Final Answer:

    Root, Left, Right -> Option D
  4. Quick Check:

    Preorder = Root, Left, Right [OK]
Hint: Remember preorder starts with the root node first [OK]
Common Mistakes:
  • Confusing preorder with inorder or postorder
  • Visiting left before root
  • Visiting right before left
2. Which of the following C++ function signatures correctly represents a preorder traversal of a binary tree node Node*?
easy
A. void preorder(Node* root) { if(root) { cout << root->data; preorder(root->left); preorder(root->right); } }
B. void preorder(Node* root) { if(root) { preorder(root->left); preorder(root->right); cout << root->data; } }
C. void preorder(Node* root) { if(root) { preorder(root->right); cout << root->data; preorder(root->left); } }
D. void preorder(Node* root) { if(root) { preorder(root->left); cout << root->data; preorder(root->right); } }

Solution

  1. Step 1: Recall preorder traversal order

    Preorder visits root first, then left subtree, then right subtree.
  2. Step 2: Check function code order

    void preorder(Node* root) { if(root) { cout << root->data; preorder(root->left); preorder(root->right); } } prints root data first, then recursively visits left and right children, matching preorder.
  3. Final Answer:

    void preorder(Node* root) { if(root) { cout << root->data; preorder(root->left); preorder(root->right); } } -> Option A
  4. Quick Check:

    Print root first, then left, then right [OK]
Hint: Print root data before recursive calls for preorder [OK]
Common Mistakes:
  • Printing after recursive calls (postorder)
  • Swapping left and right recursive calls
  • Missing null check for root
3. Given the binary tree below, what is the preorder traversal output?

      10
     /  \
    5    15
   /    /  \
  3    12  20
medium
A. [10, 15, 20, 12, 5, 3]
B. [10, 5, 3, 15, 12, 20]
C. [3, 5, 10, 12, 15, 20]
D. [5, 3, 10, 12, 15, 20]

Solution

  1. Step 1: Start at root and visit nodes in preorder

    Visit root 10, then left subtree (5, then 3), then right subtree (15, then 12 and 20).
  2. Step 2: Write traversal sequence

    Sequence is 10, 5, 3, 15, 12, 20.
  3. Final Answer:

    [10, 5, 3, 15, 12, 20] -> Option B
  4. Quick Check:

    Preorder = Root, Left, Right = [10,5,3,15,12,20] [OK]
Hint: Follow root, then left subtree, then right subtree order [OK]
Common Mistakes:
  • Mixing preorder with inorder or postorder
  • Visiting right subtree before left
  • Skipping leaf nodes
4. Identify the error in the following preorder traversal function and select the corrected version:

void preorder(Node* root) {
  if(root == nullptr) return;
  preorder(root->left);
  cout << root->data << " ";
  preorder(root->right);
}
medium
A. void preorder(Node* root) { if(root == nullptr) return; cout << root->data << " "; preorder(root->left); preorder(root->right); }
B. void preorder(Node* root) { if(root == nullptr) return; preorder(root->right); cout << root->data << " "; preorder(root->left); }
C. void preorder(Node* root) { if(root == nullptr) return; preorder(root->left); preorder(root->right); cout << root->data << " "; }
D. void preorder(Node* root) { if(root == nullptr) return; cout << root->data << " "; preorder(root->right); preorder(root->left); }

Solution

  1. Step 1: Identify preorder traversal order

    Preorder visits root first, then left subtree, then right subtree.
  2. Step 2: Check given function and options

    The given function prints after left subtree, which is inorder traversal. void preorder(Node* root) { if(root == nullptr) return; cout << root->data << " "; preorder(root->left); preorder(root->right); } prints root first, then left, then right, matching preorder.
  3. Final Answer:

    void preorder(Node* root) { if(root == nullptr) return; cout << root->data << " "; preorder(root->left); preorder(root->right); } -> Option A
  4. Quick Check:

    Print root before recursive calls for preorder [OK]
Hint: Print root data before recursive calls to fix preorder [OK]
Common Mistakes:
  • Printing after left subtree (inorder)
  • Swapping left and right subtree calls
  • Missing null pointer check
5. You have a binary tree where some nodes have only one child. How does preorder traversal help in serializing this tree uniquely, and which sequence below represents the preorder traversal of this tree?

       8
      / \
     4   10
      \    \
       6    20
hard
A. [8, 10, 20, 4, 6]
B. [4, 6, 8, 10, 20]
C. [8, 4, 6, 10, 20]
D. [6, 4, 8, 20, 10]

Solution

  1. Step 1: Understand preorder traversal for serialization

    Preorder visits root first, then left subtree, then right subtree, capturing structure including nodes with single children.
  2. Step 2: Traverse given tree in preorder

    Visit 8 (root), then left subtree: 4, then 6 (right child of 4), then right subtree: 10, then 20 (right child of 10).
  3. Step 3: Write traversal sequence

    Sequence is [8, 4, 6, 10, 20].
  4. Final Answer:

    [8, 4, 6, 10, 20] -> Option C
  5. Quick Check:

    Preorder captures root-left-right including single children [OK]
Hint: Preorder captures tree shape by visiting root before children [OK]
Common Mistakes:
  • Ignoring nodes with single child
  • Mixing preorder with inorder
  • Visiting right subtree before left
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