中后序列构建二叉树
用了大概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)