Suppose there is a tree:
1
/ \\
2 3
/ \\
4 5
Then the mirror image will
Here's a non-recursive way of doing it in python using queues. The Queue class may be initialised like this:
class Queue(object):
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
if not self.is_empty():
return self.items.pop()
def is_empty(self):
return len(self.items) == 0
def peek(self):
if not self.is_empty():
return self.items[-1]
def __len__(self):
return self.size()
def size(self):
return len(self.items)
The class which represents a node:
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.val = data
And here's the method along with traversal example which does the task:
class BinaryTree(object):
def __init__(self, root):
self.root = Node(root)
def inorder(self, start, traversal):
if start:
traversal = self.inorder(start.left, traversal)
traversal += f"{start.val} "
traversal = self.inorder(start.right, traversal)
return traversal
def mirror_tree_iterative(root):
if root is None:
return
q = Queue()
q.enqueue(root)
while not q.is_empty():
curr = q.peek()
q.dequeue()
curr.left, curr.right = curr.right, curr.left
if curr.left:
q.enqueue(curr.left)
if curr.right:
q.enqueue(curr.right)
tree = BinaryTree(1)
tree.root.left = Node(2)
tree.root.right = Node(3)
tree.root.left.left = Node(4)
tree.root.left.right = Node(5)
tree.root.right.left = Node(6)
print(tree.inorder(tree.root, ''))
mirror_tree_iterative(tree.root)
print(tree.inorder(tree.root, ''))