What if you could flip a whole tree upside down with just a few lines of code?
Why Mirror a Binary Tree in DSA Typescript?
Imagine you have a family tree drawn on paper, and you want to see its reflection as if looking in a mirror. Doing this by hand means redrawing every branch and leaf on the opposite side, which is tiring and easy to mess up.
Manually flipping each branch and leaf is slow and prone to mistakes. You might forget to swap some parts or place them incorrectly, making the mirrored tree wrong and confusing.
Using a simple method to swap the left and right branches of every node in the tree automatically creates the mirror image. This saves time and ensures accuracy by handling every part systematically.
function mirrorTree(node) {
// manually redraw each branch
// very complex and error-prone
}function mirrorTree(node) {
if (!node) return null;
[node.left, node.right] = [mirrorTree(node.right), mirrorTree(node.left)];
return node;
}This lets you quickly create a mirrored version of any tree, useful in graphics, data transformations, and problem-solving.
In photo editing apps, flipping images horizontally is like mirroring a tree structure of pixels, making the picture look reversed instantly.
Manually mirroring a tree is slow and error-prone.
Swapping left and right children recursively automates the mirror process.
This method is fast, reliable, and easy to implement.
Practice
Solution
Step 1: Understand the mirror operation
Mirroring a binary tree means swapping the left and right children of every node.Step 2: Effect on the tree structure
This operation flips the tree around its center, creating a mirror image.Final Answer:
Swap the left and right children of every node in the tree -> Option AQuick Check:
Mirror = Swap children [OK]
- Thinking mirror means sorting nodes
- Confusing mirror with removing nodes
- Assuming mirror changes node values
Solution
Step 1: Identify the input and output types
The function should accept a TreeNode or null and return a TreeNode or null after mirroring.Step 2: Check each option's signature
function mirrorTree(root: TreeNode | null): TreeNode | null matches the expected input and output types for a binary tree mirror function.Final Answer:
function mirrorTree(root: TreeNode | null): TreeNode | null -> Option DQuick Check:
Correct signature uses TreeNode or null [OK]
- Using primitive types like number or string instead of TreeNode
- Returning void instead of the mirrored tree
- Not allowing null as input
class TreeNode {
val: number;
left: TreeNode | null;
right: TreeNode | null;
constructor(val: number, left: TreeNode | null = null, right: TreeNode | null = null) {
this.val = val;
this.left = left;
this.right = right;
}
}
function mirrorTree(root: TreeNode | null): TreeNode | null {
if (!root) return null;
const left = mirrorTree(root.left);
const right = mirrorTree(root.right);
root.left = right;
root.right = left;
return root;
}
function preorder(root: TreeNode | null): number[] {
if (!root) return [];
return [root.val, ...preorder(root.left), ...preorder(root.right)];
}
const tree = new TreeNode(1, new TreeNode(2, new TreeNode(4), new TreeNode(5)), new TreeNode(3));
const mirrored = mirrorTree(tree);
console.log(preorder(mirrored));Solution
Step 1: Understand the original tree structure
The tree is:
1
āā 2
ā āā 4
ā āā 5
āā 3Step 2: Mirror the tree by swapping left and right children
After mirroring:
1
āā 3
āā 2
āā 5
āā 4Step 3: Preorder traversal of mirrored tree
Preorder visits root, left, right:
1, 3, 2, 5, 4Final Answer:
[1, 3, 2, 5, 4] -> Option BQuick Check:
Mirror preorder = [1, 3, 2, 5, 4] [OK]
- Not swapping children correctly
- Confusing preorder with inorder or postorder
- Forgetting to mirror recursively
function mirrorTree(root: TreeNode | null): TreeNode | null {
if (!root) return null;
mirrorTree(root.left);
mirrorTree(root.right);
const temp = root.left;
root.left = root.right;
root.right = temp;
return root;
}Solution
Step 1: Analyze the recursive calls
The function calls mirrorTree on root.left and root.right but does not assign the results back to root.left and root.right.Step 2: Understand the effect of missing assignments
Without assigning, the subtrees are not updated with their mirrored versions, so the mirror is incomplete.Final Answer:
The recursive calls do not assign the mirrored subtrees back to root.left and root.right -> Option CQuick Check:
Assign recursive results to children [OK]
- Ignoring return values of recursive calls
- Swapping children before recursion
- Incorrect base case handling
Solution
Step 1: Understand mirroring effect on single-child nodes
Mirroring swaps left and right children of every node.Step 2: Effect on nodes with only one child
If a node has only a left child, after mirroring, that child becomes the right child, and left becomes null.Final Answer:
Nodes with only left child will have only right child after mirroring -> Option AQuick Check:
Mirror swaps children, single left child becomes right [OK]
- Assuming children disappear after mirroring
- Thinking mirroring adds children
- Believing tree structure stays same
Ready to prove it?
Pass the test and this pattern moves unknown
