Mirror image of a binary tree

前端 未结 13 2520
时光取名叫无心
时光取名叫无心 2020-12-01 09:00

Suppose there is a tree:

             1
            / \\
           2   3
              / \\
             4   5

Then the mirror image will

13条回答
  •  爱一瞬间的悲伤
    2020-12-01 09:10

    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, ''))
    

提交回复
热议问题