Solución del problema de registro: la espada se refiere a la oferta 07. Reconstruir el árbol binario

Ingrese los resultados del recorrido en orden previo y el recorrido en orden de un árbol binario, construya el árbol binario y devuelva su nodo raíz.

Suponga que ni el recorrido en orden previo de entrada ni los resultados del recorrido en orden contienen números duplicados.

Ejemplo 1:

Entrada: preorden = [3,9,20,15,7], en orden = [9,3,15,20,7]
 Salida: [3,9,20, nulo, nulo, 15,7]

Ejemplo 2:

Entrada: preorden = [-1], en orden = [-1]
 Salida: [-1]

 Idea: es necesario comprender la relación posicional entre el nodo raíz del árbol binario y los nodos izquierdo y derecho en el recorrido previo al pedido y el recorrido posterior al pedido.

Recorrido en orden anticipado: raíz izquierda y derecha; recorrido en orden: raíz izquierda derecha. Esto invierte la construcción del árbol binario.

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if len(preorder) == 0:
            return None
        root = TreeNode(preorder[0]) # 构建根节点
        idx = inorder.index(root.val) # 左子树的节点数目(标记所在根节点的下标,在中序遍历中,第一个到根节点的前一个的长度为二叉树左子树的长度)
        root.left = self.buildTree(preorder[1:idx+1] , inorder[0:idx]) 
        # 递归左子树,其中左子树部分的前序遍历的切片为第二个节点到左子树长度+1(左闭右开区间);中序遍历为,总的中序遍历切片的第一个节点到左子树长度处。
        root.right = self.buildTree(preorder[idx+1:] ,inorder[idx+1:]) 
        # 递归右子树,其中右子树的前序遍历的切片为从左子树长度+1处开始一直到尾;中序遍历为总的中序遍历的切片的左子树长度+1处开始一直到尾。
        return root

[点击并拖拽以移动]
​

Supongo que te gusta

Origin blog.csdn.net/weixin_45314061/article/details/130836445
Recomendado
Clasificación