【力扣】1008:先序遍歷構造二叉樹

題目描述

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

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

來源:力扣(LeetCode)

算法思路

分析前序遍歷,第一個元素是根節點,然後是遞歸的左子樹值+遞歸的右子樹值。

所以構造原先的樹的時候,要完美復原,通過遞歸。
左子樹和右子樹分割通過二分查找。

這裏的二分查找不是標準二分,因爲等同於找數組的右邊界,如果數組裏沒有左子樹的話,二分查找會進入死循環,所以:if r==mid:return r

class Solution:
    def bstFromPreorder(self, preorder: List[int]) -> TreeNode:
        if not preorder:return
        if len(preorder)==1:
            return TreeNode(preorder[0])
        root=TreeNode(preorder[0])
        flag=self.BS(preorder)
        if flag:
            root.left=self.bstFromPreorder(preorder[1:flag])
            root.right=self.bstFromPreorder(preorder[flag:])
        else:
            root.left=self.bstFromPreorder(preorder[1:])
        return root

    def BS(self,ls):
        l,r=1,len(ls)-1
        while l<=r:
            mid=(l+r)//2
            if ls[mid]>ls[0]:
                if r==mid:return r
                r=mid
            else:l=mid+1
        return r if l!=len(ls) else 0

執行用時 :44 ms, 在所有 Python3 提交中擊敗了72.39%的用戶
內存消耗 :13.7 MB, 在所有 Python3 提交中擊敗了25.00%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章