1 基本思路:前序遍历的第一个节点为根节点,找到根节点在中序遍历中的位置i。然后分别找到前序遍历中左子树对应的部分,前序遍历中右子树对应的部分,中序遍历中左子树对应的部分,中序遍历中右子树对应的部分,分别用四个数组来存储。然后分别对左子树、右子树递归调用,传入的参数也对应发生改变。
2 代码实现:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int>pre,vector<int>in) {
//考虑边界情况:由于pre和in的size总是相同
int inlen=in.size();
if(inlen==0)
return NULL;
//先序遍历序列的首元素是根节点
TreeNode * head=new TreeNode(pre[0]);
//查找根节点在中序遍历序列中的位置,pos用来存储这个位置
int pos=find(in.begin(),in.end(),pre[0])-in.begin();
//用left_pre存储前序序列中的左子树,left_in存储中序序列中的左子树
//用right_pre存储前序序列中的右子树,right_in存储中序序列中的右子树
vector <int> left_pre,left_in,right_pre,right_in;