Use stack to keep track of parent nodes.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char c): val(c), left(NULL), right(NULL) {}
};
// To execute C++, please define "int main()"
TreeNode *CovertTt2Bt(string input)
{
int n = input.size();
if (!n) return NULL;
TreeNode *res = new TreeNode(input[0]);
TreeNode *cur = res;
stack<TreeNode *> s;
s.push(res);
for (int i = 1; i < n; i = i + 2) {
if (input[i] == '?') {
TreeNode *t = new TreeNode(input[i+1]);
cur->left = t;
cur = t;
s.push(cur);
} else if (input[i] == ':') {
do {
s.pop();
}
while (s.top()->right);
TreeNode *t = new TreeNode(input[i+1]);
s.top()->right = t;
cur = t;
}
}
return res;
}
void printTree(TreeNode *root) {
if (!root) return;
printf("%c ", root->val);
printTree(root->left);
printTree(root->right);
}
int main() {
string s("a?b?c:d:e");
TreeNode *res = CovertTt2Bt(s);
printTree(res);
return 0;
}