簡體   English   中英

從排序的數組中生成二叉搜索樹

[英]Making a binary search tree from a sorted array

假設我有一個帶有[1,2,3,4,5]的排序數組,它應成為此數組作為其輸出的二進制搜索樹:[4,2,5,1,3](下面的括號代表索引)

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

在進行一些在線研究時,我在此網站上找到了一個鏈接,可以用來獲取以下信息:將排序后的數組插入二進制搜索樹

我想將其轉換為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解決此問題?

表示樹的傳統功能方式是對節點使用列表或元組。 每個節點只是一個值,一個左樹和一個右樹(而樹只是一個節點,樹的根或None )。

如果您想就地變異樹木,請使用清單; 如果要構建一棵持久樹,在其中生成新的子節點,而舊子節點永不變異,請使用元組。 由於您正在查看的Java代碼是對節點進行突變,因此讓我們來看一下列表。

當然,您可以通過使用namedtuple代替tupledataclass (或者如果您不使用Python 3.7+並且不想等待向后移植到Python版本),在PyPI上使用attrs來使這個想法更出色。的list (甚至只是一個dict 。)這使您可以使用.left (或['left'] )之類的漂亮名稱來代替[1]類的序列操作,但實際上並沒有改變功能。 既然我們決定使用可變的,並且我們可能不想在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)

您確實應該使用類,但是如果不想,可以使用字典。

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])

您可以使用list完成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]的輸出您必須對上面形成的二進制搜索樹進行級別順序遍歷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM