题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
解题思路
- 前序遍历的第一个值为根结点,在中序遍历中找到该值的下标
- 中序遍历该值左边为根结点左子树,右边为根结点右子树
- 前序遍历从第一个节点往后数 与中序遍历左子树相同个数的节点,为左子树
- 本轮分析得到根结点,以及左子树,右子树的值
- 递归即可得到整个树
代码实现
/**
* 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 || len(inorder) <= 0 {
return nil
}
root := &TreeNode{Val: preorder[0]}
i := 0
for index, num := range inorder {
if num == root.Val {
i = index
break
}
}
root.Left = buildTree(preorder[1:i+1], inorder[:i])
root.Right = buildTree(preorder[i+1:], inorder[i+1:])
return root
}