前序遍历顺序为:根左右,中序遍历顺序为:左根右,可以根据前序和中序数组中的"根"来划分出左右子树,递归构建出树,所以步骤为:
- 前序的根肯定是在第一个 0
- 根据前序的根去中序中找到根所在位置 idx
- 根据根切割,前序的左子树是 [1:idx+1](包含 idx),右子树是 [idx+1:]
- 根据根切割,中序的左子树是 [:idx],右子树是 [idx+1:]
func buildTree(pre []int, in []int) *TreeNode {
if len(pre) == 0 {
return nil
}
root := &TreeNode{Val:pre[0]}
idx := 0
for i, v := range in {
if pre[0] == v {
idx = i
break
}
}
root.Left = buildTree(pre[1:idx+1], in[:idx])
root.Right = buildTree(pre[idx+1:], in[idx+1:])
return root
}