Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]
二、思路分析
- 前序遍历的顺序是先遍历根节点,然后左子树,最后右子树。这表明着前序遍历结果的第一个数是整个数的根节点。
- 中序遍历的顺序是先遍历左子树,再遍历根,再遍历右子树。这表明中序遍历的数组结果中,根节点的左侧是左子树节点,右侧是右子树节点。
- 根据前序遍历和中序遍历的数组结果重建二叉树,前序遍历的第一个节点为根节点,再用该跟节点找到中序数组中的跟节点位置index。
- 建立子树可以视为递归过程,root.left 传入前序数组的[1:index]数据,中序数组的[:index]的数据。右子树则传入另一半数据,前序数组[index+1:],中序数组的[i+1:]。
三、AC 代码
/**
* 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
}
root := &TreeNode{preorder[0],nil,nil}
//找到inorder中根节点位置
i := 0
for ;i< len(inorder);i++ {
if inorder[i] == preorder[0] {
break
}
}
root.Left = buildTree(preorder[1:i+1],inorder[:i])
root.Right = buildTree(preorder[i+1:],inorder[i+1:])
return root
}
四、总结
此题通过使用前序和中序数组的性质,达到重建二叉树的目的,熟悉前序和中序遍历后,可以很快理解这道题目。