重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
限制:
0 <= 节点个数 <= 5000
解题思路
本次使用递归思路
二叉树的构建思路是前序遍历的顺序就是检测的核心,检测前序遍历的首位等于中序建立的哪一位,哪一位就是根节点。
前序遍历的位数和中序遍历到根的位数相同,例如前序3,9,中序9,3,3为根节点,9及为左侧,中序遍历3右侧的即为根右侧的。
然后检测左右两侧即可。
package main
func main() {
preorder := []int{3, 9, 20, 15, 7}
inorder := []int{9, 3, 15, 20, 7}
buildTree(preorder, inorder)
}
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
root := &TreeNode{preorder[0], nil, nil}
//赋值为本根的值
i := 0
for ; i < len(preorder); i++ {
if preorder[0] == inorder[i] {
break
}
}
root.Left = buildTree(preorder[1:len(inorder[:i])+1], inorder[:i])
root.Right = buildTree(preorder[len(inorder[:i])+1:], inorder[i+1:])
return root
}
//TreeNode is TreeNode
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。