已知前序和中序遍历,重新构造二叉树
Solution
思路 : 前序遍历序列用于找出当前节点的值,后序遍历序列用于分开前序序列中那些部分是左子树,哪些部分是右子树节点。
本质还是前序遍历的结构上,添加参数
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def divid_Tree(self,x,inorder,inorder_start,inorder_end):
for i in range(inorder_start,inorder_end+1):
if inorder[i]==x:
return i
# 先序遍历告诉你那个是子节点,中序遍历告诉你,先序遍历中哪些是左子树哪些是右子树
def builT(self, preorder, inorder,preorder_start,preorder_end,inorder_start,inorder_end):
if preorder_end<preorder_start:
return None
if inorder_end<inorder_start:
return None
root = TreeNode(val = preorder[preorder_start])
in_index = Solution.divid_Tree(self,preorder[preorder_start],inorder,inorder_start,inorder_end)
#左子树节点总数
left_num = in_index - inorder_start
root.left = Solution.builT(self,preorder, inorder,preorder_start+1,preorder_start+left_num,inorder_start,in_index-1)
root.right = Solution.builT(self,preorder, inorder,preorder_start+left_num+1,preorder_end,in_index+1,inorder_end)
return root
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
return Solution.builT(self,preorder,inorder,0,len(preorder)-1,0,len(inorder)-1)