[leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal


問題の説明


リンク
順序付け、順序付けでbstを作成する問題の表示

アクセス1-Recursion

  • preorder[0]は、ルート
  • です.
  • inorderでは、
  • を使用してルートを左child、右childに分割します.
  • 再帰路樹摸
  • コード1

        def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
            left = right = None 
            num = len(preorder)
            if num == 0: return left
            
            root = TreeNode(preorder[0])
            if num == 1: return root
            elif num == 2:
                if preorder == inorder:
                    right = TreeNode(preorder[1])
                else:
                    left = TreeNode(preorder[1])
            else:
                rootIdx = inorder.index(root.val)
                left = self.buildTree(preorder[1:rootIdx + 1], inorder[:rootIdx])
                right = self.buildTree(preorder[rootIdx+1:], inorder[rootIdx+1:])
            root.left = left
            root.right = right 
            return root

    アクセス2-アプリケーションの復元

  • orderでルート値インデックスを検索するたびに
  • 時間がかかります.
    ポップアップ
  • inorderとpreorderによる再帰
  • popの効率を向上するために、inorder、preorder配列を
  • に反転する.
  • inorderで3を見る前は左、その後は右
  • コード2

    class Solution:
        def buildTree(self, preorder, inorder):
            def build(stop):
                if inorder and inorder[-1] != stop:
                    root = TreeNode(preorder.pop())
                    root.left = build(root.val)
                    inorder.pop()
                    root.right = build(stop)
                    return root
            preorder.reverse()
            inorder.reverse()
            return build(None)