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
[点击并拖拽以移动]