一、题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:你可以假设树中没有重复元素。
示例:
前序遍历:preorder=[3,9,20,15,7]
中序遍历:inorder=[9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
二、思路分析
- 二叉树
前序遍历
顺序:中左右。即先遍历根节点,随后遍历左子树,最后遍历右子树。 - 二叉树
中序遍历
顺序:左中右。即先遍历左子树,再遍历根节点,最后遍历右子树。 - 二叉树
后序遍历
顺序:左右中。即先遍历左子树,再遍历右子树,最后遍历根节点。
在递归地遍历某个子树的过程中,也是将这棵子树看成一颗全新的树。其实我们根据前序和中序就能得到一棵完整的二叉树。而且题目中要求:可以假设树中没有重复元素。这样就能得到一棵唯一的二叉树。
递归方法:
对于任意一棵树而言,根节点总是前序遍历的第一个节点。
前序遍历:[根节点,[左子树所有的节点],[右子树所有的节点]]
中序遍历:[[左子树所有的节点],根节点,[右子树所有的节点]]
只要我们在中序遍历中找到根节点的位置,我们就可以分别知道左子树和右子树的节点个数。由于同一棵子树的前序和中序的长度显然是相同的,因此找到左子树和右子树的起始位置和结束位置。
三、代码实现
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/