コード例 #1
0
def construct_core(preorder, start_preorder, end_preorder, inorder,
                   start_inorder, end_inorder):
    """
    先根据前序遍历序列的第一个数字创建根结点,接下来在中序遍历序列中找到根结点的位置,
    这样就能确定左、右子树结点的数量。在前序遍历和中序遍历的序列中划分了左、右子树结
    点的值之后,就可以递归地去分别构建它的左右子树。
    :param preorder:
    :param start_preorder:
    :param end_preorder:
    :param inorder:
    :param start_inorder:
    :param end_inorder:
    :return:
    """
    # 前序遍历的第一个数字是根结点的值
    root_value = preorder[start_preorder]
    root = BinTree(root=root_value)
    root.left = root.right = None
    root.data = root.root
    if start_preorder == end_preorder:
        if start_inorder == end_inorder and inorder[start_inorder] == inorder[
                end_inorder]:
            return root
        else:
            raise Exception("错误的输入")

    # 在中序遍历中找到根结点的值
    root_inorder = start_inorder
    while root_inorder <= end_inorder and inorder[root_inorder] != root_value:
        root_inorder += 1
    # 如果两个序列不匹配
    if root_inorder == end_inorder and inorder[root_inorder] != root_value:
        raise Exception("两个序列不匹配!", root_value, inorder[root_value])
    left_length = root_inorder - start_inorder
    left_preorder_end = start_preorder + left_length
    # 构建左子树
    if left_length > 0:
        root.left = construct_core(preorder, start_preorder + 1,
                                   left_preorder_end, inorder, start_inorder,
                                   root_inorder - 1)
    # 构建右子树
    if left_length < end_preorder - start_preorder:
        # root.right = construct_core(preorder, left_preorder_end + 1, end_preorder, inorder, root_inorder + 1,
        #                             end_inorder)
        root.right = construct_core(preorder, left_preorder_end + 1,
                                    end_preorder, inorder, root_inorder + 1,
                                    end_inorder)
    return root