106.从中序与后序遍历序列构造二叉树

79 阅读1分钟

题目:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
算法:

func buildTree(inorder []int, postorder []int) *TreeNode {
	var dfs func(inorderStart, inorderEnd, postorderStart, postorderEnd int) *TreeNode
	dfs = func(inorderStart, inorderEnd, postorderStart, postorderEnd int) *TreeNode {
		if inorderStart > inorderEnd || postorderStart > postorderEnd {
			return nil
		}
		if inorderStart == inorderEnd {
			return &TreeNode{Val: inorder[inorderStart]}
		}
		leftNodeLeght := 0
		for i := inorderStart; i <= inorderEnd; i ++ {
			if inorder[i] == postorder[postorderEnd] {
				break
			}
			leftNodeLeght ++
		}
		node := &TreeNode{Val: postorder[postorderEnd]}
		node.Left = dfs(inorderStart, inorderStart + leftNodeLeght - 1, postorderStart, postorderStart + leftNodeLeght - 1)
		node.Right = dfs(inorderStart + leftNodeLeght + 1, inorderEnd, postorderStart + leftNodeLeght, postorderEnd - 1)
		return node
	}
	return dfs(0, len(inorder) - 1, 0, len(postorder) - 1)
}