#include <iostream>
#include <string>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
TreeNode* buildTreeFromGeneralizedList(const string& s, int& index) {
if (index >= s.length() || s[index] == ')') {
return nullptr;
}
int val = 0;
while (index < s.length() && isdigit(s[index])) {
val = val * 10 + (s[index] - '0');
index++;
}
TreeNode* node = new TreeNode(val);
while (index < s.length() && isspace(s[index])) {
index++;
}
if (index < s.length() && s[index] == '(') {
index++;
node->left = buildTreeFromGeneralizedList(s, index);
while (index < s.length() && isspace(s[index])) {
index++;
}
if (index < s.length() && s[index] == ',') {
index++;
node->right = buildTreeFromGeneralizedList(s, index);
}
}
while (index < s.length() && (isspace(s[index]) || s[index] == ')')) {
index++;
}
return node;
}
void printTree(TreeNode* root, int level = 0) {
if (root == nullptr) return;
cout << string(level * 2, ' ') << root->val << endl;
printTree(root->left, level + 1);
printTree(root->right, level + 1);
}
void destroyTree(TreeNode* root) {
if (root == nullptr) return;
destroyTree(root->left);
destroyTree(root->right);
delete root;
}
int main() {
string s = "1(2(4,),3)";
int index = 0;
TreeNode* root = buildTreeFromGeneralizedList(s, index);
printTree(root);
destroyTree(root);
return 0;
}