中后序列构建二叉树
用了大概6个小时,在递归中止条件没有想好,同时stl没用好end的边界老是越界使用,包括调试的过程中也是越界使用导致调试本身也引发错误(没有debug的CLion啊!!)以后设计end时可以将end单独作为全局的检测元素就不用通过iterator-1来测试(这样本身也是有问题的,如it就是容器第一个!)
#include <vector>
#include <iostream>
using namespace std;
typedef vector<int>::iterator Iterator;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void print(Iterator s, Iterator e){
while(s != e){
cout<<*s<<" ";
s += 1;
}
}
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return buildTree(pre.begin(), pre.end(), vin.begin(), vin.end());
}
TreeNode* buildTree(Iterator pre_beg, Iterator pre_end, Iterator vin_beg, Iterator vin_end){
TreeNode *t = NULL;
// cout<<"(";
if(pre_beg != pre_end) {//一开始是先使用it->val再++it再检测,在end处则直接宕掉
// print(pre_beg, pre_end);
// cout<<", ";
// print(vin_beg, vin_end);
// cout<<endl;
t = new TreeNode(*pre_beg);
++pre_beg;
Iterator vin_mid = find(vin_beg, vin_end, *(pre_beg - 1));
Iterator pre_mid = pre_beg + (vin_mid - vin_beg);
// cout<<*(pre_mid-1)<<endl;
// cout<<"pre_mid: "<<*pre_mid<<", pre_end: "<<*(pre_end-1);
// cout<<", vin_mid+1: "<<*(vin_mid+1)<<", vin_end: "<<*(vin_end-1)<<endl;
// cout<<"left"<<endl;越界检查,最后一个end总是会出事,而且递归中无法避免,考虑将end和第一个的再前一个两个边界设为全局,然后之间检查每个容器是否为边界;
t->left = buildTree(pre_beg, pre_mid, vin_beg, vin_mid);
// cout<<"right"<<endl;
t->right = buildTree(pre_mid, pre_end, vin_mid + 1, vin_end);
}
// else{
// cout<<"end";
// }
// cout<<"), ";
return t;
}
};简洁版
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return buildTree(pre.begin(), pre.end(), vin.begin(), vin.end());
}
TreeNode* buildTree(Iterator pre_beg, Iterator pre_end, Iterator vin_beg, Iterator vin_end){
TreeNode *t = NULL;
if(pre_beg != pre_end) {
t = new TreeNode(*pre_beg);
++pre_beg;
Iterator vin_mid = find(vin_beg, vin_end, *(pre_beg - 1));
Iterator pre_mid = pre_beg + (vin_mid - vin_beg);
t->left = buildTree(pre_beg, pre_mid, vin_beg, vin_mid);
t->right = buildTree(pre_mid, pre_end, vin_mid + 1, vin_end);
}
return t;
}
};时间O(n),空间O(n)

京公网安备 11010502036488号