從先序遍歷還原二叉樹
做此題的思路和用 中序遍歷和前(後)序遍歷重建二叉樹的思路是非常一致的。
從序列中找出根節點、左子樹、右子樹——不斷切割序列,遞歸地向下建樹
——而確定根節點和左右子樹根節點的依據就是深度。
時間複雜度:
但是不知道爲什麼這麼慢啊
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* recoverFromPreorder(string S) {
return create(0,0,S.size()-1,S);
}
TreeNode* create(int layer,int ld,int rd,const string &S){
if(ld>rd){
return nullptr;
}
int val = 0;
for(int i = layer+ld;i<=rd;i++){
if(S[i]<'0' || S[i]>'9'){
break;
}
val = val*10+(S[i]-'0');
}
TreeNode* root = new TreeNode(val);
string target = "";
for(int i=0;i<layer+1;i++){
target+="-";
}
int lidx =-1,ridx=-1;
root->left = nullptr;
root->right = nullptr;
for(int i=ld;i+layer<=rd;i++){
if(S.substr(i,layer+1) == target && ( i+layer+1>rd || S[i+layer+1]!='-') && (i-1<ld || S[i-1]!='-' ) ){
if(lidx==-1){
lidx = i;
}else{
ridx = i;
}
}
}
if(lidx==-1){
return root;
}
if(ridx==-1){
root->left = create(layer+1,lidx,rd,S);
}else{
root->left = create(layer+1,lidx,ridx-1,S);
root->right = create(layer+1,ridx,rd,S);
}
return root;
}
};