Example #1
0
    finding_x_for_each_node__pre_order(root.left, x_table,
                                       horizontal_distance - 1)
    finding_x_for_each_node__pre_order(root.right, x_table,
                                       horizontal_distance + 1)


def vertical_order(root):
    x_table: Dict[int, list] = dict()  # map of number, list
    finding_x_for_each_node__pre_order(root, x_table)

    for x in sorted(x_table.keys()):
        print_array_inline(x_table[x])


if __name__ == "__main__":
    tree_root = BinaryTree.single_line_input(input_array())
    BinaryTree.display(tree_root)
    vertical_order(tree_root)
"""
                       1
                      / \
                     2   3
                    / \   \
                   4   5   6
                  /     \
                 7       8   
1 2 3 4 5 -1 6 7 -1 -1 8 -1 -1 -1 -1 -1 -1

Output
7
4
Example #2
0
    global diameter  # Update diameter, when curr_diameter > left + right depth
    diameter = max(diameter, left_depth + right_depth)  # Notice

    return max(left_depth, right_depth) + 1  # maximum_depth


def diameter_of_binary_tree(root: BinaryTreeNode) -> int:
    find_depth(
        root
    )  # basically find the diameter when we are processing the tree for finding depth
    return diameter


if __name__ == "__main__":
    tree_input = input_array()
    tree_root = BinaryTree.single_line_input(tree_input)
    BinaryTree.display(tree_root)
    print("diameter : ", diameter_of_binary_tree(tree_root))
"""
            1
          /   \
        2      3
      /  \
    4     5
    
1 2 3 4 5 -1 -1 -1 -1 -1 -1
"""
"""
          0
         / \ 
        1   2