#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
TreeNode(int val) :val(val), left(nullptr), right(nullptr){}
};
vector<int> preorder(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> s;
if (root == NULL)
return ans;
s.push(root);
while (!s.empty()) {
TreeNode* cur = s.top();
s.pop();
ans.push_back(cur->val);
if (cur->right)
s.push(cur->right);
if (cur->left)
s.push(cur->left);
}
return ans;
}
vector<int> inorder(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> s;
while (root || !s.empty()) {
while (root) {
s.push(root);
root = root->left;
}
TreeNode* cur = s.top();
s.pop();
ans.push_back(cur->val);
root = cur->right;
}
return ans;
}
vector<int> postorder(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> s;
TreeNode* pre = NULL;
while (root || !s.empty()) {
while (root) {
s.push(root);
root = root->left;
}
TreeNode* cur = s.top();
s.pop();
if (cur->right == NULL || cur->right == pre) {
ans.push_back(cur->val);
pre = cur;
}
else {
s.push(cur);
root = cur->right;
}
}
return ans;
}
int main() {
TreeNode* a1 = new TreeNode(1);
TreeNode* a2 = new TreeNode(2);
TreeNode* a3 = new TreeNode(3);
a1->left = a2;
a1->right = a3;
vector<int> pre = preorder(a1);
vector<int> in = inorder(a1);
vector<int> post = postorder(a1);
for (int i = 0;i < pre.size();i++)
cout << pre[i] << " ";
cout << endl;
for (int i = 0;i < in.size();i++)
cout << in[i] << " ";
cout << endl;
for (int i = 0;i < post.size();i++)
cout << post[i] << " ";
cout << endl;
return 0;
}