面试题07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
. 3
. / \
9 20
… / \
…15 7。
限制:
0 <= 节点个数 <= 5000
思路
中序遍历就是把树拍扁得到的数组,前序遍历的第一个节点就是这个树的根节点。
根据这个根节点可以把中序遍历拆分为左右子树的中序遍历。
然后通过递归把左右子树的根节点拎出来,最终重构二叉树。
我的解答
func buildTree(preorder []int, inorder []int) (Head *TreeNode ){
if len(inorder)==0{
return nil
}
for _,vp:=range preorder{
for ii,vi:=range inorder{
if vp==vi{
Left:=buildTree(preorder,inorder[:ii])
Right:=buildTree(preorder,inorder[ii+1:])
Head:= &TreeNode{
Val:vp,
Left:Left,
Right:Right,
}
return Head
}
}
}
return
}