LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal

개발공부를해보자·2025년 2월 16일

LeetCode

목록 보기
54/95

파이썬 알고리즘 인터뷰 54번(리트코드 105) Construct Binary Tree from Preorder and Inorder Traversal
https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

나의 풀이

# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        if not preorder:
            return None
        root = TreeNode(preorder[0])
        idx = inorder.index(root.val)
        inorder_left = inorder[:idx]
        inorder_right = inorder[idx + 1:]
        preorder_left = preorder[1:1 + len(inorder_left)]
        preorder_right = preorder[1 + len(inorder_left):]
        root.left = self.buildTree(preorder_left, inorder_left)
        root.right = self.buildTree(preorder_right, inorder_right)
        return root

다른 풀이1

# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        preorder = deque(preorder)
        def build(preorder, inorder):
            if inorder:
                index = inorder.index(preorder.popleft())
                node = TreeNode(inorder[index])
                node.left = build(preorder, inorder[0:index])
                node.right = build(preorder, inorder[index + 1:])
                return node
        return build(preorder, inorder)

다른 풀이2

# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
    
        mapping = {}

        for i in range(len(inorder)):
            mapping[inorder[i]] = i
        
        preorder = collections.deque(preorder)

        def build(start, end):
            if start > end: return None

            root = TreeNode(preorder.popleft())
            mid = mapping[root.val]

            root.left = build(start, mid - 1)
            root.right = build(mid + 1, end)

            return root

        return build(0, len(preorder) - 1)
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글