def construct_helper(pre_order, in_order, pre_start, pre_end, in_start,
                     in_end):
    if pre_start > pre_end:
        return
    index = -1
    for (i, num) in enumerate(in_order):
        if num == pre_order[pre_start]:
            index = i
            break
    if index == -1:
        raise RuntimeError(u"错误的输入")
    root = TreeNode(pre_order[index])
    left_length = index - in_start
    root.left = construct_helper(pre_order, in_order, pre_start + 1,
                                 pre_start + left_length, in_start, index - 1)
    root.right = construct_helper(pre_order, in_order,
                                  pre_start + left_length + 1, pre_end,
                                  index + 1, in_end)
    return root
def helper(root, n, val, nodes):
    val += root.val
    nodes.append(root)
    if not root.left and not root.right:
        if val == n:
            for node in nodes:
                print node.val,
            print "\n"
        nodes.pop()
        return
    if root.left:
        helper(root.left, n, val, nodes)
    if root.right:
        helper(root.right, n, val, nodes)
    nodes.pop()


if __name__ == '__main__':
    node1 = TreeNode(10)
    node2 = TreeNode(5)
    node3 = TreeNode(12)
    node4 = TreeNode(4)
    node5 = TreeNode(7)
    node6 = TreeNode(6)
    node7 = TreeNode(7)
    node1.left = node2
    node1.right = node3
    node2.left = node4
    node2.right = node5
    print_path_of_n(node1, 22)
    right = get_depth_of_tree(root.right)
    return left + 1 if left > right else right + 1


def is_balanced_tree(root):
    if not root:
        return True, 0
    left, left_depth = is_balanced_tree(root.left)
    right, right_depth = is_balanced_tree(root.right)
    return left and right and abs(
        left_depth - right_depth) <= 1, \
           left_depth + 1 if left_depth > right_depth else right_depth + 1


if __name__ == '__main__':
    node1 = TreeNode(1)
    node2 = TreeNode(2)
    node3 = TreeNode(3)
    node4 = TreeNode(4)
    node5 = TreeNode(5)
    node6 = TreeNode(6)
    node7 = TreeNode(7)
    node1.left = node2
    node1.right = node3
    node2.left = node4
    node2.right = node5
    node3.left = node6
    node3.right = node7
    print get_depth_of_tree(node1)
    print is_balanced_tree(node1)

def helper(root1, root2):
    if not root2:
        return True
    if not root1 or root1.val != root2.val:
        return False
    return helper(root1.left, root2.left) and helper(root1.right, root2.right)


if __name__ == '__main__':
    node1 = TreeNode(1)
    node2 = TreeNode(2)
    node3 = TreeNode(3)
    node4 = TreeNode(4)
    node5 = TreeNode(5)
    node6 = TreeNode(6)
    node7 = TreeNode(7)
    node1.left = node2
    node1.right = node3
    node2.left = node4
    node2.right = node5
    node3.left = node6
    node3.right = node7
    node8 = TreeNode(2)
    node9 = TreeNode(4)
    node10 = TreeNode(5)
    node8.left = node9
    node8.right = node10
    print is_substructure_of_tree(node1, node8)