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

2121 단어 leetcodetheabbiedsa
두 개의 정수 배열 inorderpostorder가 주어지면 inorder는 이진 트리의 내위 순회이고 postorder는 동일한 트리의 후위 순회이며 이진 트리를 구성하고 반환합니다.

예 1:



입력: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
출력: [3,9,20,널,널,15,7]

예 2:

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

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

  • 해결책:

    # 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 max((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 = TreeNode()
                    root.left = self.buildTreeRec(p, currRoot)
                if currRoot < q - 1:
                    root.right = TreeNode()
                    root.right = self.buildTreeRec(currRoot + 1, q)
                return root
    
        def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
            n = len(postorder)
            self.inorder = inorder
            self.valIndex = {}
            for i, item in enumerate(postorder):
                self.valIndex[item] = i
            return self.buildTreeRec(0, n)
    

    좋은 웹페이지 즐겨찾기