在递归函数的参数中,p 和 q 表示了当前子树在 postorder 中的索引范围。但是,在递归调用时,下一个子树的索引范围应该是根据当前节点左右子树的长度来计算,而不是直接使用 inorderpos - i 作为左子树长度。
以下是修正后的代码:
func recursion(i, j int, inorder []int, p, q int, postorder []int) *TreeNode {
if i > j {
return nil
}
num := postorder[q] // 取当前节点值
inorderpos := i
for inorder[inorderpos] != num {
inorderpos++
}
leftlength := inorderpos - i
newnode := &TreeNode{Val: num}
// 通过索引范围传递子数组给下一层递归
newnode.Left = recursion(i, inorderpos-1, inorder, p, p+leftlength-1, postorder)
newnode.Right = recursion(inorderpos+1, j, inorder, p+leftlength, q-1-leftlength+p+leftlength+1-i , postorder)
return newnode
}
func buildTree(inorder []int, postorder []int) *TreeNode {
if len(inorder) == 0 || len(postorder) == 0 {
return nil
}
return recursion(0, len(inorder)-1, inorder, 0 , len(postorder)-1 , postorder)
}
修改后的代码将正确计算左右子树的索引范围,避免了访问到 -1 索引位的问题。
内容由零声教学AI助手提供,问题来源于学员提问




