889.根据前序和后序遍历构造二叉树

97 阅读1分钟

题目:
给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。

如果存在多个答案,您可以返回其中 任何 一个。
算法:
模拟一遍运行过程,在|的位置分割数组 preorder = [1,|2,4,5|,3,6,7], postorder = [4,5,2|,6,7,3|,1] preorder,postorder之后一个元素时,构成一个node节点

func constructFromPrePost(preorder []int, postorder []int) *TreeNode {
	var dfs func(preOrderStart, preOrderEnd, postOrderStart, postOrderEnd int) *TreeNode
	dfs = func(preOrderStart, preOrderEnd, postOrderStart, postOrderEnd int) *TreeNode {
		if preOrderStart > preOrderEnd || postOrderStart > postOrderEnd {
			return nil
		}
		if 	preOrderStart == preOrderEnd {
			return &TreeNode{Val: preorder[preOrderStart] }
		}
		leftNodeLength := 0
		for i := preOrderStart + 1; i <= preOrderEnd; i ++ {
			
			if preorder[i] == postorder[postOrderEnd - 1] {
				break
			}
			leftNodeLength ++
		} 
		// fmt.Println(leftNodeLength, preOrderStart, preOrderEnd, postOrderStart, postOrderEnd )

		node := &TreeNode{Val: preorder[preOrderStart]}
		node.Left = dfs(preOrderStart + 1, preOrderStart + leftNodeLength, postOrderStart , postOrderStart + leftNodeLength - 1)
		node.Right = dfs(preOrderStart + leftNodeLength + 1 ,preOrderEnd , postOrderStart + leftNodeLength, postOrderEnd - 1)

		return node
	}
	return dfs(0, len(preorder) - 1, 0, len(postorder) - 1)
}