368 字
2 分钟
LeetCode-105.从前序与中序遍历序列构造二叉树
二叉树
给定两个整数数组
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]
看思路后的解法
思路:从前序遍历序列的第一个元素确定根节点,然后在中序遍历序列中找到该根节点的位置,其左侧为左子树的中序序列,右侧为右子树的中序序列。接着根据左子树的节点个数,在前序序列中划分出左子树和右子树的前序序列,最后递归地构建左右子树即可。
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func buildTree(preorder []int, inorder []int) *TreeNode { if len(preorder) == 0 { return nil }
rootVal := preorder[0] root := &TreeNode{Val: rootVal}
var rootIndex int for i, v := range inorder { if v == rootVal { rootIndex = i break } }
leftinorder := inorder[:rootIndex] rightinorder := inorder[rootIndex+1:]
size := len(leftinorder) leftpreorder := preorder[1:size+1] rightpreorder := preorder[size+1:]
root.Left = buildTree(leftpreorder, leftinorder) root.Right = buildTree(rightpreorder, rightinorder)
return root}ai优化版
func buildTree(preorder []int, inorder []int) *TreeNode { if len(preorder) == 0 { return nil }
rootVal := preorder[0] root := &TreeNode{Val: rootVal}
var rootIndex int for i, v := range inorder { if v == rootVal { rootIndex = i break } }
leftSize := len(inorder[:rootIndex])
root.Left = buildTree(preorder[1 : 1+leftSize], inorder[:rootIndex])
root.Right = buildTree(preorder[1+leftSize:], inorder[rootIndex+1:])
return root} LeetCode-105.从前序与中序遍历序列构造二叉树
https://sheep44044.github.io/posts/算法/二叉树/leetcode-105从前序与中序遍历序列构造二叉树/