#include <stack>
#include <utility>
#include <string>
#include <sstream>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
void inorder(TreeNode* root) {
map<TreeNode*, TreeNode*> placeholders;
stack<TreeNode*> stk;
if ( root != NULL ) {
TreeNode* placeholder = new TreeNode( root->val );
placeholder->left = root->left;
placeholder->right = root->right;
placeholders[placeholder] = root;
stk.push( placeholder );
while ( !stk.empty() ) {
TreeNode *top_elem = stk.top();
stk.pop();
if ( placeholders.find(top_elem) != placeholders.end() ) {
// is a placeholder
if ( top_elem->left != NULL ) {
if ( top_elem->right != NULL ) {
placeholder = new TreeNode( top_elem->right->val );
placeholder->left = top_elem->right->left;
placeholder->right = top_elem->right->right;
placeholders[placeholder] = top_elem->right;
stk.push( placeholder );
}
// important!
stk.push( placeholders[top_elem] );
placeholder = new TreeNode( top_elem->left->val );
placeholder->left = top_elem->left->left;
placeholder->right = top_elem->left->right;
placeholders[placeholder] = top_elem->left;
stk.push( placeholder );
}
else {
cout << top_elem->val << " ";
if ( top_elem->right != NULL ) {
placeholder = new TreeNode( top_elem->right->val );
placeholder->left = top_elem->right->left;
placeholder->right = top_elem->right->right;
placeholders[placeholder] = top_elem->right;
stk.push( placeholder );
}
}
}
else { // is not a placeholder
cout << top_elem->val << " ";
}
}
}
}
};