105.从前序与中序遍历序列构造二叉树

58 阅读1分钟

题目:
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 算法: 计算leftNum := rootPos - iStart是因为左节点可能为空

func buildTree(preorder []int, inorder []int) *TreeNode {
	return doBuildTree(preorder, 0, len(preorder) - 1, inorder, 0, len(inorder) - 1)
}

func doBuildTree(preorder []int, pStart, pEnd int, inorder []int, iStart, iEnd int) *TreeNode {
	if pStart > pEnd || iStart > iEnd {
		return nil
	}
	// 这里不能搞错了
	rootPos := iStart
	for i := iStart; i <= iEnd; i ++ {
		if inorder[i] == preorder[pStart]{
			rootPos = i
			break
		}
	}
	node := &TreeNode{Val: preorder[pStart]}
	leftNum := rootPos - iStart
	node.Left = doBuildTree(preorder, pStart + 1, pStart + leftNum, inorder, iStart, rootPos - 1)
	node.Right = doBuildTree(preorder, pStart + leftNum + 1, pEnd, inorder, rootPos + 1, iEnd)
	return node
}