Preorder 및 Inorder Traversal에서 이진 트리 구성

2022 단어 leetcodetheabbiedsa
두 개의 정수 배열 preorderinorder가 주어지면 preorder는 이진 트리의 전위 순회이고 inorder는 동일한 트리의 중위 순회이며 이진 트리를 구성하고 반환합니다.

예 1:



입력: 선주문 = [3,9,20,15,7], 선주문 = [9,3,15,20,7]
출력: [3,9,20,널,널,15,7]

예 2:

입력: preorder = [-1], inorder = [-1]
출력: [-1]

제약:
  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorderinorder는 고유한 값으로 구성됩니다.
  • inorder의 각 값은 preorder에도 나타납니다.
  • preorder는 트리의 선주문 순회임을 보장합니다.
  • inorder는 트리의 중위 순회임을 보장합니다.

  • 해결책:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def getRoot(self, p, q):
            return min((i for i in range(p, q)), key = lambda x: self.valIndex[self.inorder[x]])
    
        def buildTreeRec(self, p, q):
            if p < q:
                root = TreeNode()
                currRoot = self.getRoot(p, q)
                root.val = self.inorder[currRoot]
                if currRoot > p:
                    root.left = self.buildTreeRec(p, currRoot)
                if currRoot < q - 1:
                    root.right = self.buildTreeRec(currRoot + 1, q)
                return root
    
        def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
            n = len(inorder)
            self.inorder = inorder
            self.valIndex = {}
            for i, item in enumerate(preorder):
                self.valIndex[item] = i
            return self.buildTreeRec(0, n)
    

    좋은 웹페이지 즐겨찾기