1008. 前序遍歷構(gòu)造二叉搜索樹(Python)

難度:★★★☆☆
類型:二叉樹
方法:遞歸

題目

力扣鏈接請移步本題傳送門
更多力扣中等題的解決方案請移步力扣中等題目錄

返回與給定前序遍歷 preorder 相匹配的二叉搜索樹(binary search tree)的根結(jié)點。

(回想一下,二叉搜索樹是二叉樹的一種,其每個節(jié)點都滿足以下規(guī)則,對于 node.left 的任何后代,值總 < node.val,而 node.right 的任何后代,值總 > node.val。此外,前序遍歷首先顯示節(jié)點 node 的值,然后遍歷 node.left,接著遍歷 node.right。)

題目保證,對于給定的測試用例,總能找到滿足要求的二叉搜索樹。

示例:

輸入:[8,5,1,7,10,12]
輸出:[8,5,10,1,7,null,12]

提示:

1 <= preorder.length <= 100
1 <= preorder[i] <= 10^8
preorder 中的值互不相同

解答

什么是二叉搜索樹?中序遍歷是遞增序列的樹。這道題目翻譯一下,就是給出前序遍歷和中序遍歷,構(gòu)造二叉樹。

復(fù)習(xí)一下前序和中序,前序是中左右,后序是左中右,這個不要搞混,前序中的第一個元素一定是根節(jié)點,通過尋找根節(jié)點在中序中的位置,實際上就找到了中序的劃分方式,也就是說,哪部分是左子樹,哪部分是右子樹,在中序遍歷中就明確下來了,不僅如此,有了左子樹的數(shù)目,前序遍歷中的劃分方式也就明確。因此可以通過遞歸實現(xiàn)構(gòu)建。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def bstFromPreorder(self, preorder):
        inorder = sorted(preorder)

        def construct(pre, infix):
            if not pre:
                return

            root = TreeNode(pre[0])
            idx = infix.index(pre[0])
            root.left = construct(pre[1:1+idx], infix[:idx])
            root.right = construct(pre[1+idx:], infix[1+idx:])
            return root

        return construct(preorder, inorder)

如有疑問或建議,歡迎評論區(qū)留言~

有關(guān)更多力扣中等題的python解決方案,請移步力扣中等題解析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容