从前序与中序遍历序列构造二叉树-Leetcode 105
思路来自:https://blog.csdn.net/htt789/article/details/80164049
脑子不好使
思路:
1.前序序列第一个为根结点,在中序序列中找到该结点位置,中序序列就分为左右子树结点
2.前序序列除第一个结点,其余为左右子树结点,根据中序序列中左右子树各自的长度将前序序列划分了左右子树
3.这样就将序列划分为根结点、左子树前序序列、左子树中序序列、右子树前序序列、右子树中序序列
4.按左右子树序列递归建树
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if len(preorder)!=0 or len(inorder)!=0:
root = TreeNode(preorder[0])
index = inorder.index(root.val)
# print(index)
if index == 0:
inorder_left_node = []
else:
inorder_left_node = inorder[:index]
if index == len(inorder)-1:
inorder_right_node = []
else:
inorder_right_node = inorder[index+1:]
if len(inorder_left_node):
preorder_left_node = preorder[1:len(inorder_left_node)+1]
else:
preorder_left_node = []
if len(inorder_right_node):
preorder_right_node = preorder[len(inorder_left_node)+1:]
else:
preorder_right_node = []
root.left = self.buildTree(preorder_left_node, inorder_left_node)
root.right = self.buildTree(preorder_right_node, inorder_right_node)
return root