Printing BFS (Binary Tree) in Level Order with Specific Formatting

前端 未结 15 1364
情歌与酒
情歌与酒 2020-12-04 13:00

To begin with, this question is not a dup of this one, but builds on it.

Taking the tree in that question as an example,

    1 
   / \\
  2   3
 /            


        
15条回答
  •  [愿得一人]
    2020-12-04 13:29

    Here is a Python gist which prints the tree by level. The idea behind it is to use BFS and keep a level marker integer which marks the end the last node of the level. This is similar to Naresh's sentinel approach, but without the need of inserting a sentinel inside the queue, since this is accomplished by the level marker.

    This algorithm has a space complexity of O(2tree_height)

    # Print tree by levels - using BFS
    # Time complexity of O(n)
    # Space complexity: O(2^tree_height)
    
    from collections import deque
    
    class Node:
        def __init__(self, data, left=None, right=None):
            self.data = data
            self.left = left
            self.right = right
    
    def print_levels_tree(root: Node):
        q = deque()
        q.append(root)
        level, level_marker = 0, 1
        while q:
            if (level_marker == 0):
                level, level_marker = level + 1, len(q)
                print("", end = '\n')
            level_marker -= 1
    
            node = q.popleft()
    
            if (node is None):
                continue
    
            print(node.data, " ", end = '')
    
            q.append(node.left)
            q.append(node.right)
    
    
    # Some examples
    tree = Node(19, Node(7, Node(3), Node(11)), Node(19)) 
    print_levels_tree(tree)
    
    left = Node(7, Node(3, Node(2), Node(5)), Node(11, None, Node(17, Node(13))))
    tree = Node(19, left, Node(43))
    print_levels_tree(tree)
    
    left = Node(7, Node(3, Node(2), Node(5)), Node(11, None, Node(17, Node(13))))
    right = Node(43, Node(23, None, Node(37, Node(29, None, Node(31)), Node(41))), Node(47, None, Node(53)) )
    tree = Node(19, left, right)
    print_levels_tree(tree)
    

    Which prints something like:

    19  
    7  43  
    3  11  23  47  
    2  5  17  37  53  
    

    If you want to use a \t separator, it would look like:

    19  
    7   43  
    3   11  23  47  
    2   5   17  37  53  
    

    This gist is available at https://gist.github.com/lopespm/993f0af88cf30b7f8c9e17982518b71b

提交回复
热议问题