| 
 | 1 | + | 
 | 2 | +# Given a binary Tree  | 
 | 3 | +# 		    1  | 
 | 4 | +# 		 /     \  | 
 | 5 | +# 	     2	     3  | 
 | 6 | +# 	    / \ 	/ \  | 
 | 7 | +#  	   4  5    6   7  | 
 | 8 | +# Print zig-zag level order traversal  | 
 | 9 | +# 1 3 2 4 5 6 7  | 
 | 10 | +#  | 
 | 11 | + | 
 | 12 | +class TreeNode:  | 
 | 13 | +    def __init__(self, data):  | 
 | 14 | +        """Representation of a binary tree node"""  | 
 | 15 | +        self.data = data  | 
 | 16 | +        self.left = None  | 
 | 17 | +        self.right = None  | 
 | 18 | + | 
 | 19 | + | 
 | 20 | +class Tree:  | 
 | 21 | +    def __init__(self):  | 
 | 22 | +        """Reprentation of a binary tree"""  | 
 | 23 | +        self.root = None  | 
 | 24 | + | 
 | 25 | +    def _print_level(self, node, level, zig):  | 
 | 26 | +        """Utility function to print the level, level starts with 1"""  | 
 | 27 | +        if node is None:  | 
 | 28 | +            return  | 
 | 29 | +        if level == 1:  | 
 | 30 | +            print(node.data, end=' ')  | 
 | 31 | +            return  | 
 | 32 | +        else:  | 
 | 33 | +            if zig:  | 
 | 34 | +                self._print_level(node.left, level-1, zig)  | 
 | 35 | +                self._print_level(node.right, level-1, zig)  | 
 | 36 | +            else:  | 
 | 37 | +                self._print_level(node.right, level-1, zig)  | 
 | 38 | +                self._print_level(node.left, level-1, zig)  | 
 | 39 | + | 
 | 40 | +    def _height(self, node):  | 
 | 41 | +        """Gets the height of the tree from node"""  | 
 | 42 | +        if node is None:  | 
 | 43 | +            return 0  | 
 | 44 | +        else:  | 
 | 45 | +            return max(self._height(node.left), self._height(node.right)) + 1  | 
 | 46 | + | 
 | 47 | +    def print_zig_zag(self):  | 
 | 48 | +        """Prints the zig zag level order"""  | 
 | 49 | +        if self.root is None:  | 
 | 50 | +            return  | 
 | 51 | +        h = self._height(self.root)  | 
 | 52 | +        zig = True  | 
 | 53 | +        for i in range(1, h+1):  | 
 | 54 | +            self._print_level(self.root, i, not zig)  | 
 | 55 | +            print()  | 
 | 56 | +      | 
 | 57 | +    def in_order(self):  | 
 | 58 | +        """In order traversal of the tree"""  | 
 | 59 | +        current = self.root  | 
 | 60 | +        stack = []  | 
 | 61 | +        done = False  | 
 | 62 | +        while not done:  | 
 | 63 | +            if current is not None:  | 
 | 64 | +                stack.append(current)  | 
 | 65 | +                current = current.left  | 
 | 66 | + | 
 | 67 | +            elif stack:  | 
 | 68 | +                current = stack.pop()  | 
 | 69 | +                print(current.data, end=' ')  | 
 | 70 | +                current = current.right  | 
 | 71 | +            else:  | 
 | 72 | +                done = True  | 
 | 73 | +        print()  | 
 | 74 | + | 
 | 75 | +if __name__ == "__main__":  | 
 | 76 | +    tree = Tree()  | 
 | 77 | +    tree.root = TreeNode(1)  | 
 | 78 | +    tree.root.left = TreeNode(2)  | 
 | 79 | +    tree.root.right = TreeNode(3)  | 
 | 80 | +    tree.root.left.left = TreeNode(4)  | 
 | 81 | +    tree.root.left.right = TreeNode(5)  | 
 | 82 | +    tree.root.right.left = TreeNode(6)  | 
 | 83 | +    tree.root.right.right = TreeNode(7)  | 
 | 84 | + | 
 | 85 | +    print("In order:")  | 
 | 86 | +    tree.in_order()  | 
 | 87 | + | 
 | 88 | +    print("Zig zag level order:")  | 
 | 89 | +    tree.print_zig_zag()  | 
0 commit comments