解题思路:
(1)前序序列中的第一个肯定为根结点,此时在中序序列中找到这个根结点的位置,设为pos
(2)如果一棵树的左(右)子树存在,那么它在前序序列和中序序列中的长度是一样的
(3)那么就可以将根结点的左右子树的前序序列和中序序列提取出来,递归构造
(4)详情请见代码
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> vin) {
//新建节点
TreeNode *root = new TreeNode(pre[0]);
//在中序序列中找到根节点的位置
int pos = find(vin.begin(),vin.end(),pre[0])-vin.begin();
if (pos!=0) { //存在左子树
vector<int> lpre(pre.begin()+1,pre.begin()+pos+1);
vector<int> lvin(vin.begin(),vin.begin()+pos);
root->left = reConstructBinaryTree(lpre,lvin);
}
if (pos!=pre.size()-1) { //存在右子树
vector<int> rpre(pre.begin()+pos+1,pre.end());
vector<int> rvin(vin.begin()+pos+1,vin.end());
root->right = reConstructBinaryTree(rpre,rvin);
}
return root;
}
};