Bird
Raised Fist0
DSA C++programming~5 mins

Mirror a Binary Tree in DSA C++ - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Mirror a Binary Tree
O(n)
Understanding Time Complexity

We want to understand how the time needed to mirror a binary tree changes as the tree grows.

How does the number of steps grow when the tree has more nodes?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


void mirrorTree(Node* root) {
    if (root == nullptr) return;
    mirrorTree(root->left);
    mirrorTree(root->right);
    std::swap(root->left, root->right);
}
    

This code swaps the left and right children of every node in the tree, effectively mirroring it.

Identify Repeating Operations
  • Primary operation: Recursive calls visiting each node once and swapping children.
  • How many times: Once per node in the tree.
How Execution Grows With Input

Each node is visited once, so the total steps grow directly with the number of nodes.

Input Size (n)Approx. Operations
10About 10 swaps and recursive calls
100About 100 swaps and recursive calls
1000About 1000 swaps and recursive calls

Pattern observation: The work grows in a straight line with the number of nodes.

Final Time Complexity

Time Complexity: O(n)

This means the time to mirror the tree grows directly with the number of nodes in the tree.

Common Mistake

[X] Wrong: "Mirroring only swaps the root's children, so it takes constant time."

[OK] Correct: Every node's children must be swapped, so the whole tree must be visited, not just the root.

Interview Connect

Understanding this helps you explain how recursive tree algorithms scale, a key skill for many coding challenges.

Self-Check

"What if we changed the tree to be a linked list (all nodes have only one child)? How would the time complexity change?"

Practice

(1/5)
1. What does mirroring a binary tree mean?
easy
A. Sorting the nodes in ascending order
B. Reversing the order of nodes in each level
C. Swapping the left and right children of every node
D. Deleting all leaf nodes

Solution

  1. Step 1: Understand the mirror operation

    Mirroring means swapping left and right children of every node in the tree.
  2. Step 2: Clarify what happens to nodes

    Each node's left child becomes its right child and vice versa, recursively.
  3. Final Answer:

    Swapping the left and right children of every node -> Option C
  4. Quick Check:

    Mirror = Swap children [OK]
Hint: Mirror means swap left and right children at all nodes [OK]
Common Mistakes:
  • Thinking mirror means reversing node values
  • Confusing mirror with tree traversal order
  • Assuming mirror deletes nodes
2. Which of the following is the correct C++ function signature to mirror a binary tree node?
easy
A. void mirror(Node* root)
B. int mirror(Node root)
C. Node mirror(Node* root)
D. void mirror(Node root)

Solution

  1. Step 1: Identify correct parameter type

    The function should take a pointer to the root node to modify the tree in place.
  2. Step 2: Identify correct return type

    Since the tree is modified in place, the function can return void.
  3. Final Answer:

    void mirror(Node* root) -> Option A
  4. Quick Check:

    Pointer param + void return = void mirror(Node* root) [OK]
Hint: Use pointer parameter and void return for in-place tree changes [OK]
Common Mistakes:
  • Passing node by value instead of pointer
  • Returning Node instead of void
  • Using incorrect parameter types
3. What is the output of the following code after mirroring the binary tree?
struct Node {
  int data;
  Node* left;
  Node* right;
};

void mirror(Node* root) {
  if (!root) return;
  mirror(root->left);
  mirror(root->right);
  Node* temp = root->left;
  root->left = root->right;
  root->right = temp;
}

// Tree before mirror:
//     1
//    / \
//   2   3
//  /     \
// 4       5

Node* root = new Node{1, new Node{2, new Node{4, nullptr, nullptr}, nullptr}, new Node{3, nullptr, new Node{5, nullptr, nullptr}}};
mirror(root);
// Print inorder traversal
void inorder(Node* node) {
  if (!node) return;
  inorder(node->left);
  std::cout << node->data << " ";
  inorder(node->right);
}
inorder(root);
medium
A. 5 3 1 4 2
B. 5 3 1 2 4
C. 1 2 4 3 5
D. 4 2 1 3 5

Solution

  1. Step 1: Understand the original tree and inorder traversal

    Original inorder: left-root-right = 4 2 1 3 5
  2. Step 2: Mirror swaps left and right children recursively

    Mirrored tree structure: 1 / \ 3 2 / \ 5 4 Inorder traversal now: 5 3 1 2 4
  3. Final Answer:

    5 3 1 2 4 -> Option B
  4. Quick Check:

    Inorder mirrored = 5 3 1 2 4 [OK]
Hint: Mirror swaps children; inorder reverses left-right order [OK]
Common Mistakes:
  • Not swapping children correctly
  • Confusing preorder with inorder traversal
  • Printing original tree instead of mirrored
4. Identify the error in this mirror function and choose the fix:
void mirror(Node* root) {
  if (root == nullptr) return;
  mirror(root->left);
  mirror(root->right);
  Node* temp = root->left;
  root->left = root->right;
  root->right = temp;
  return root;
}
medium
A. Swap root->left and root->right before recursive calls
B. Change 'if (root == nullptr)' to 'if (!root->left && !root->right)'
C. Add 'delete temp;' after swapping
D. Function should return void, remove 'return root;'

Solution

  1. Step 1: Check function return type and usage

    The function is declared void but tries to return root pointer, which causes a compile error.
  2. Step 2: Fix by removing the return statement

    Since the tree is modified in place, no return is needed; remove 'return root;'.
  3. Final Answer:

    Function should return void, remove 'return root;' -> Option D
  4. Quick Check:

    Void function must not return value [OK]
Hint: Void functions should not return values [OK]
Common Mistakes:
  • Returning value from void function
  • Changing base case incorrectly
  • Deleting nodes unnecessarily
5. Given a binary tree, how would you modify the mirror function to also count how many nodes were swapped during the mirroring process?
hard
A. Return the number of nodes from the function and sum left and right counts
B. Add a counter parameter and increment it each time children are swapped
C. Use a global variable to count swaps inside the mirror function
D. Count nodes before and after mirroring and subtract counts

Solution

  1. Step 1: Understand counting swaps during recursion

    Each node swap can be counted by returning 1 plus counts from left and right subtrees.
  2. Step 2: Modify mirror to return int and sum counts

    Return 0 if node is null; else return 1 + mirror(left) + mirror(right).
  3. Final Answer:

    Return the number of nodes from the function and sum left and right counts -> Option A
  4. Quick Check:

    Return counts from recursion to sum swaps [OK]
Hint: Return counts from recursion to sum swapped nodes [OK]
Common Mistakes:
  • Using global variables causing side effects
  • Counting nodes before and after mirroring (no change)
  • Not accumulating counts correctly
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