从排序的数组

时间:2018-03-17 20:23:37

标签: python arrays python-3.x binary-search-tree

假设我有一个带有[1,2,3,4,5]的排序数组,它应该成为一个二进制搜索树,以此数组作为输出:[4,2,5,1,3](下面的括号代表指数)

                               4 (0) 
                              /    \
                           2 (1)    5 (2)
                            /  \
                         1 (3)  3 (4)

在线进行一些研究时,我在此网站上找到了一个链接,我可以使用它来获取此信息:Insert sorted array into binary search tree

我想在不使用任何类的情况下将其转换为Python 3。这是我到目前为止所做的,但我被卡住了。

def bstlist(arr,start,end):
    newlst = []
    #start = arr[0]
    #end = arr[-1]
    if start > end:
        return [] #null

    mid = start + (end - start) / 2
    newlst = arr[mid]

我对如何在Python中的Java实现中实现三行代码感到特别困惑:

TreeNode node = new TreeNode(arr[mid]);
node.left = sortedArrayToBST(arr, start, mid-1);
node.right = sortedArrayToBST(arr, mid+1, end);

我将如何在Python中实现它们?有没有其他方法可以在Python中解决这个问题而不是链接中列出的方法?

3 个答案:

答案 0 :(得分:1)

表示树的传统功能方式是使用列表或元组作为节点。每个节点只是一个值,一个左树和一个右树(树只是一个节点,树的根,或None)。

如果要在适当位置变异树,请使用列表;如果你想构建一个持久树,你生成新的子节点而旧的子节点永远不会发生变化,请使用元组。由于您正在查看的Java代码是变异节点,因此请使用列表。

如果您不是namedtuple代替tupledataclass(或使用attrs关闭PyPI,那么您当然可以成为这位发烧友使用Python 3.7+并且不想等待回溯到Python版本)代替list。 (或者甚至只是一个dict。)这允许您使用.left(或['left'])之类的好名称来代替[1]之类的序列操作,但它不会#39} ; t实际上改变了功能。由于我们决定选择变数,我们可能不想在2018年初要求使用Python 3.7 - 此外,你说你不想要任何课程 - 我会坚持下去与list

# TreeNode node = new TreeNode(arr[mid]);
node = [arr[mid], None, None]

# node.left = sortedArrayToBST(arr, start, mid-1);
node[1] = sortedArrayToBST(arr, start, mid-1)

# node.right = sortedArrayToBST(arr, mid+1, end);
node[2] = sortedArrayToBST(arr, mid+1, end)

答案 1 :(得分:0)

你真的应该使用类,但如果你不想,你可以使用字典。

def list_to_bst(l):
    if len(l) == 0:
        return None
    mid = len(l) // 2
    return {
        "value": l[mid],
        "left": list_to_bst(l[:mid]),
        "right": list_to_bst(l[mid+1:])
    }

然后你可以像这样使用它

list_to_bst([1, 2, 3, 4, 5])

答案 2 :(得分:0)

您可以使用列表完成bstlist功能:

def bstlist(arr, st, end):
    newlst = []
    if st > end:
        return []
    mid = st + (end-st)/2
    # adding the root list
    root = [arr[mid]]
    # getting the left list
    left = bstlist(arr, st, mid-1)
    # getting the right list
    right = bstlist(arr, mid+1, end)

    newlst = root + left+ right
    return newlst

调用bstlist函数将返回列表,这是顺序,您应在其中插入数字以获得平衡树

示例:

  

arr = [1,2,3,4,5]

     

bstarr = bstlist(arr,0,len(arr)-1)

你将获得bstarr

  

[3,1,2,4,5]

这意味着您必须先插入 3 ,然后再插入 1 ,依此类推。

树将如下所示:

           3
         /   \
        1     4
         \     \
          2     5

要将输出作为 [3,1,4,2,5] ,您必须在上面形成的二叉搜索树上进行水平顺序遍历。