題目描述
返回與給定先序遍歷 preorder 相匹配的二叉搜索樹(binary search tree)的根結點。
(回想一下,二叉搜索樹是二叉樹的一種,其每個節點都滿足以下規則,對於 node.left 的任何後代,值總 < node.val,而 node.right 的任何後代,值總 > node.val。此外,先序遍歷首先顯示節點的值,然後遍歷 node.left,接着遍歷 node.right。)
算法思路
分析前序遍歷,第一個元素是根節點,然後是遞歸的左子樹值+遞歸的右子樹值。
所以構造原先的樹的時候,要完美復原,通過遞歸。
左子樹和右子樹分割通過二分查找。
這裏的二分查找不是標準二分,因爲等同於找數組的右邊界,如果數組裏沒有左子樹的話,二分查找會進入死循環,所以: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%的用戶