# Mirror A Binary Tree

## Question

Construct 2 algorithms to make mirror image of any binary tree inputs, one of them using recursive method, another one using looping method. Mirror image means a binary tree that is the horizontal reflection of the original tree.

## Solution

First, to do it in recursive method, we can perform pre-order traversal as usual, see preference. Then swap the left and right children for every node.

reflect(node) if node is null then return swap(node.left, node.right) if node.left is not null then reflect(node.left) if node.right is not null then reflect(node.right)

Second, to do it in looping method, we can make use of a stack. Put root node in the stack first. Then in a while-loop, as long as the stack isn’t empty, swap its children. Then put the children nodes into the stack.

reflect(root) if root is null then return stack.push(root) while stack is not empty, do node = stack.pop() swap(node.left, node.right) if node.left is not null then reflect(node.left) if node.right is not null then reflect(node.right)

## Example

``````# node structure
class Node:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right

# swap node's children while visiting
def visit(node):
temp = node.left
node.left = node.right
node.right = temp

# reflect a binary tree
def mirror_tree(node):
if not node: return
visit(node)
if node.left: mirror_tree(node.left)
if node.right: mirror_tree(node.right)

def print_tree(node):
this_level = [node]
while this_level:
next_level = list()
print map(lambda n: n.value, this_level)
for n in this_level:
if n.left: next_level.append(n.left)
if n.right: next_level.append(n.right)
this_level = next_level

# a binary tree and display how was it before reflection
print 'original'
node_05 = Node(5)
node_07 = Node(7)
node_09 = Node(9)
node_11 = Node(11)
node_06 = Node(6, node_05, node_07)
node_10 = Node(10, node_09, node_11)
node_08 = Node(8, node_06, node_10)
root = node_08
print_tree(root)

# do reflection
print ''
print 'became'
mirror_tree(root)
print_tree(root)
``````