要点:通过让每一个递归都从数字开始,找到可递归性
struct Tnode {
int val;
Tnode* left;
Tnode* right;
Tnode(int val = 0, Tnode* left = nullptr, Tnode* right = nullptr)
:val(val), left(left), right(right) {};
};
class Tree {
private:
int where;
bool lflag;
public:
Tnode* root;
Tree() {
root = nullptr;
lflag = true;
where = 0;
}
void createT_Recursion(string& s, Tnode* r);
};
void Tree::createT_Recursion(string& s, Tnode* r) { //父节点
int i = where, n = s.size();
Tnode* p;
if (s[i] <= '9' && s[i] >= '0') { //遇到节点,看是根还是子
int num = 0;
while (s[i] <= '9' && s[i] >= '0') {
num = num * 10 + s[i++] - '0';
}
p = new Tnode(num);
if (r == nullptr) {
root = p;
r = p;
}
where = i + 1; //下一次继续地方
if (i == n || s[i] == ')') {
r->right = p; //该父节点处理完
lflag = true;
return;
}
else if (s[i] == '(') { //该节点有子节点 处理所有子节点
if (r != p ) { //先把该节点挂在当前父节点
if (lflag) {
r->left = p;
}
else {
r->right = p;
}
}
lflag = true;
createT_Recursion(s, p);//该节点作为父节点,建左树
if (s[where] == ')') { //没有右树
while (where < n && !isdigit(s[where]))
where++;
return;
}
if (s[where] == ',') { //不能省略
where++;
}
lflag = false; //此时where一定指向数字字符
createT_Recursion(s, p);
}
else if (s[i] == ',') { //父节点的右孩子
r->left = p;
lflag = false;
}
}
}