题目:
分析:
刚开始,我以为是返回数组。那太简单了。
嗯,要构造一颗树。还可以吧。
如果节点只有一个子节点,那么保证该子节点为左子节点。
唯一性。
感觉不难。
good,自己一次秒杀!(就是细节还是调了一小下)
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void f(int dep,string s,int &x,TreeNode* t)
{
if(x==s.size()) return;
int c=x;
int n=0;
while(s[c]=='-') {
c++; n++;
}
if(n!=dep) return;
t->left=new TreeNode();
t->left->left=NULL;
t->left->right=NULL;
int num=0;
while(c<s.size()&&s[c]!='-')
{
num=num*10+s[c]-'0';
c++;
}
t->left->val=num;
x=c;
f(dep+1,s,x,t->left);
//right
c=x;
n=0;
while(s[c]=='-'){
c++; n++;
}
if(n!=dep) return;
t->right=new TreeNode();
t->right->left=NULL;
t->right->right=NULL;
num=0;
while(c<s.size()&&s[c]!='-')
{
num=num*10+s[c]-'0';
c++;
}
t->right->val=num;
x=c;
f(dep+1,s,x,t->right);
}
TreeNode* recoverFromPreorder(string S) {
if(S.size()==0) return NULL;
TreeNode* t=new TreeNode();
t->left=NULL;
t->right=NULL;
int c=0;
int i=0;
while(i<S.size()&&S[i]!='-')
{
c=c*10+S[i]-'0';
i++;
}
t->val=c;
f(1,S,i,t);
return t;
}
};