Сцепка бинарного дерева из центрированного и прямого проходов

Сцепка бинарного дерева из центрированного и прямого проходов

https://t.me/pythonl


Задача: Даны 2 списка preorder и inorder, где preorder - центрированный порядок дерева (сenter > left > rigth), inorder - прямой проход (left > center > right). Оба - описывают структуру одного дерева, необходимо сконструировать бинарное дерево.

Пример:

Ввод: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]

Вывод: [3,9,20,null,null,15,7]

Ввод: preorder = [-1], inorder = [-1]

Вывод: [-1]

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        inorder_map={val:idx for idx, val in enumerate(inorder)}
        preorder_idx=0

        def treeHelper(left, right):
            nonlocal preorder_idx
            if left>right:
                return None

            node_val = preorder[preorder_idx]
            root=TreeNode(node_val)
            preorder_idx+=1

            inorder_index=inorder_map[node_val]

            root.left = treeHelper(left, inorder_index-1 )
            root.right = treeHelper(inorder_index+1, right)

            return root

        return treeHelper(0, len(inorder)-1)



Report Page