思路:1. 从后序遍历的数组中找出最后一个值,2. 在中序遍历的数组中找到该值的下标,把中序数组分割成两部分(分割点为找到的下标,两部分是除了分割点之外的左右两部分),3.再把后序遍历的数组分割成左右两部分,分割点的下标为2步骤找到的下标,左部分不包含分割点,右部分包含分割点。分割成的左右两部分为左右子二叉树。4.重复1、2、3步骤,直到确定二叉树。
如:
中序遍历 inorder = [9,3,15,20,7],后序遍历 postorder = [9,15,7,20,3]
第一次分割: inorder = [9,3,15,20,7] , 分割点的下标为1.
postorder = [9,15,7,20,3] => 3的左子树:postorder1 = [9] ,3的右子树:postorder2 = [15,7,20]
第二次分割: inorder1 = [9] , 只有一个元素,不再分割.
postorder1 = [9]
第三次分割: inorder = [15,20,7] , 分割点的下标为1.
postorder = [15,7,20] => 左子树:20的postorder3 = [15] ,20的右子树:postorder4 = [7]
结果:
func buildTree(inorder []int, postorder []int) *TreeNode {
//判断是否为空节点
if len(inorder) < 1 && len(postorder) < 1{
return nil
}
//如果不为空,那么取后序数组最后一个元素作为节点元素。
node := postorder[len(postorder) - 1]
//找到后序数组最后一个元素在中序数组的位置,作为切割点
index := find(inorder,node)
root := &TreeNode{
Val:node,
Left:buildTree(inorder[:index],postorder[:index]),
Right:buildTree(inorder[index+1:],postorder[index:len(postorder) - 1]),
}
return root
}
//找到后序数组最后一个元素在中序数组的下标
func find(inorder []int,node int) int{
for i,v := range inorder{
if v == node{
return i
}
}
return -1
}