题目:
给定两个整数数组 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
}