essay

hot100-从前序与中序遍历序列构造二叉树

#算法

hot100——从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

image.png
输入: 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
}
comments如果有不同意见或者补充,直接留在这里。
contact

在别处继续找到我

如果你想聊技术、设计,或者只是打个招呼。

暂未配置外部链接