#include <iostream>
#include <queue>
#include <string>
using namespace std;
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
};
TreeNode* buildTree(const string& preorder) {
if (preorder.empty() || preorder[0] == '*') return nullptr;
TreeNode* root = new TreeNode(preorder[0]);
int i = 1;
root->left = buildTree(preorder.substr(i, preorder.find('*', i) - i));
i += preorder.find('*', i) - i + 1;
root->right = buildTree(preorder.substr(i));
return root;
}
void preorderTraversal(TreeNode* root) {
if (!root) return;
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void inorderTraversal(TreeNode* root) {
if (!root) return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
void postorderTraversal(TreeNode* root) {
if (!root) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
void levelOrderTraversal(TreeNode* root) {
if (!root) return;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
void deleteTree(TreeNode* root) {
if (root) {
deleteTree(root->left);
deleteTree(root->right);
delete root;
}
}
int main() {
string preorder = "ABC**DE*G**F***";
TreeNode* root = buildTree(preorder);
cout << "Preorder traversal: ";
preorderTraversal(root);
cout << endl;
cout << "Inorder traversal: ";
inorderTraversal(root);
cout << endl;
cout << "Postorder traversal: ";
postorderTraversal(root);
cout << endl;
cout << "Level order traversal: ";
levelOrderTraversal(root);
cout << endl;
deleteTree(root);
return 0;
}