essay
hot100-从前序与中序遍历序列构造二叉树
#算法
hot100——从前序与中序遍历序列构造二叉树
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder 和 inorder 均 无重复 元素
inorder 均出现在 preorder
preorder 保证 为二叉树的前序遍历序列
inorder 保证 为二叉树的中序遍历序列
解法
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
// 前序第一个元素是根节点
rootVal := preorder[0]
root := &TreeNode{Val: rootVal}
// 在中序中找到根节点位置
var index int
for i, val := range inorder {
if val == rootVal {
index = i
break
}
}
// 切分出左子树和右子树的遍历序列
leftInorder := inorder[:index] // 左子树中序
rightInorder := inorder[index+1:] // 右子树中序
leftPreorder := preorder[1 : 1+len(leftInorder)] // 左子树前序(长度与左子树中序相同)
rightPreorder := preorder[1+len(leftInorder):] // 右子树前序
// 递归构建左右子树
root.Left = buildTree(leftPreorder, leftInorder)
root.Right = buildTree(rightPreorder, rightInorder)
return root
}