leetcode_1008 前序遍历构造二叉搜索树

515 阅读1分钟

要求

返回与给定前序遍历 preorder 相匹配的二叉搜索树(binary search tree)的根结点。

(回想一下,二叉搜索树是二叉树的一种,其每个节点都满足以下规则,对于 node.left 的任何后代,值总 < node.val,而 node.right 的任何后代,值总 > node.val。此外,前序遍历首先显示节点 node 的值,然后遍历 node.left,接着遍历 node.right。)

题目保证,对于给定的测试用例,总能找到满足要求的二叉搜索树。

  示例:

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

image.png

核心代码

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: List[int]) -> Optional[TreeNode]:
        inorder = sorted(preorder)
        return self.buildTree(preorder,inorder)
    
    def buildTree(self,preorder,inorder):
        if not preorder:
            return None
        root = TreeNode(preorder[0])
        left_inorder = inorder[:inorder.index(root.val)]
        right_inorder = inorder[inorder.index(root.val) + 1:]

        l_left = len(left_inorder)
        left_preorder = preorder[1:l_left + 1]
        right_preorder = preorder[l_left + 1:]
        root.left = self.buildTree(left_preorder,left_inorder)
        root.right = self.buildTree(right_preorder,right_inorder)
        return root

image.png

解题思路:我们已知的是二叉搜索树的中序遍历是有顺序的,所以我们对先序进行排列就能得到相对应的中序遍历的值,这个和我们之前做的根据先序和中序还原二叉树是一样的了。