题目
根据一棵树的前序遍历与中序遍历构造二叉树。
注意
你可以假设树中没有重复的元素
案例1
输入:
前序遍历:[3, 9, 20, 15, 7]
中序遍历:[9, 3, 15, 20, 7]
输出:
{"Val":3,"Left":{"Val":9,"Left":null,"Right":null},"Right":{"Val":20,"Left":{"Val":15,"Left":null,"Right":null},"Right":{"Val":7,"Left":null,"Right":null}}}
思路
- 先序遍历的顺序是根节点,左子树,右子树;中序遍历的顺序是左子树,根节点,右子树;
- 需要根据先序遍历得到根节点,然后在中序遍历中找到“根节点”的位置;
- “根节点”的左边就是左子树的节点,右边就是右子树的节点;
- 生成左子树和右子树就可以递归的进行了。
代码
// buildTree
// 构建二叉树
// @param preorder 前序遍历参数 中左右
// @param 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(inorder); i++ {
if inorder[i] == preorder[0] {
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
}
参考
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。