这么简单的思想,却弄了这么久。问题在于没学过c++,没掌握c++的函数和指针
下面两篇分别使用了
迭代器来复制vector
参考:https://blog.csdn.net/sunhaobo1996/article/details/79471207
涉及:
迭代器的使用 vector::iterator
copy函数: https://blog.csdn.net/qq_43066253/article/details/88702460
先为vector分配空间,否则程序会崩
https://www.cnblogs.com/youxin/archive/2012/04/16/2452035.html
std::back_inserter https://www.cnblogs.com/zhangdongsheng/p/6432131.html
https://www.cnblogs.com/youxin/archive/2012/04/16/2452035.html
不用预先为vector分配空间
指针构建vector
参考:https://blog.csdn.net/SCS199411/article/details/91835958
指针指向需要的位置后,使用vector的assign也是可以的https://blog.csdn.net/vict_wang/article/details/88812389
涉及find(in.begin(), in.end(), value) :http://c.biancheng.net/view/7489.html
关于vector向量的坑
使用 vector指针访问vector元素时,不能简单的类似于c中数组和指针的方式。需要使用迭代器。
https://blog.csdn.net/chenwenjun1/article/details/86365959
最后附上我的各种改版:
/**
* 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> vin) {
int len = pre.size();
if (len==0) return NULL;
vector<int> pre_left,pre_right,vin_left,vin_right;
TreeNode* head = new TreeNode(pre[0]);
//方法一
// int gen;
// for(int i=0;i<vin.size();i++){
// if(vin[i]==pre[0]) {gen=i; break;}
// }
// for(int i=0; i<gen; i++) {vin_left.push_back(vin[i]); pre_left.push_back(pre[i+1]);}
// for(int i=gen+1; i<vin.size(); i++) {vin_right.push_back(vin[i]); pre_right.push_back(pre[i]);}
//方法二
// auto pos = find(vin.begin(), vin.end(), pre[0]);
// int leftSize = pos - vin.begin();
// int rightSize = vin.end() - pos - 1;
// pre_left = vector<int>(pre.begin() + 1, pre.begin() + 1 + leftSize);
// vin_left = vector<int>(vin.begin(), vin.begin() + leftSize);
// pre_right = vector<int>(pre.begin() + 1 + leftSize, pre.end());
// vin_right = vector<int>(vin.begin() + leftSize + 1, vin.end());
//或者
// pre_left.assign(pre.begin() + 1, pre.begin() + 1 + leftSize);
// vin_left.assign(vin.begin(), vin.begin() + leftSize);
// pre_right.assign(pre.begin() + 1 + leftSize, pre.end());
// vin_right.assign(vin.begin() + leftSize + 1, vin.end());
//方法三
int gen;
for(int i=0;i<vin.size();i++){
if(vin[i]==pre[0]) {gen=i; break;}
}
vector<int>* p = ⪯
vector<int>* q = &vin;
// pre_left.assign(pre.begin() + 1, pre.begin() + 1 + gen);
// vin_left.assign(vin.begin(), vin.begin() + gen);
// pre_right.assign(pre.begin() + 1 + gen, pre.end());
// vin_right.assign(vin.begin() + gen + 1, vin.end());
pre_left.assign(p->begin() + 1, p->begin() + 1 + gen);
vin_left.assign(q->begin(), q->begin() + gen);
pre_right.assign(p->begin() + 1 + gen, p->begin() + pre.size());
vin_right.assign(q->begin() + gen + 1, q->begin() + vin.size()); //或者q->end()
head->left = reConstructBinaryTree(pre_left, vin_left);
head->right = reConstructBinaryTree(pre_right, vin_right);
return head;
}
};