#include <vector>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
template <class K>
class node {
public:
node * left;
node * right;
node(K val, node* left, node* right) : val(val), left(left), right(right) {};
private:
K val;
};
template <class K>
class tree {
friend class node<K>;
public:
node<K> * root;
void inorder(node<K> * curr);
void preorder(node<K> * curr);
void postorder(node<K> * curr);
};
template <class K>
void tree<K>::inorder(node<K> * curr) {
if (curr == NULL) return;
inorder(curr->left);
cout << curr->val << " ";
inorder(curr->right);
}
template <class K>
void tree<K>::preorder(node<K> * curr) {
if (curr == NULL) return;
cout << curr->val << " ";
preorder(curr->left);
preorder(curr->right);
}
template <class K>
void tree<K>::postorder(node<K> * curr) {
if (curr == NULL) return;
postorder(curr->left);
postorder(curr->right);
cout << curr->val << " ";
}
int main() {
tree<int> mytree;
node<int> node1(1, NULL, NULL);
node<int> node2(2, NULL, NULL);
node<int> node3(3, NULL, NULL);
node<int> node4(4, NULL, NULL);
mytree.root = &node1;
mytree.root->right = &node2;
mytree.root->left = &node3;
mytree.root->right->right = &node4;
/*
1
3 2
4
*/
mytree.inorder(mytree.root);
cout << endl;
mytree.preorder(mytree.root);
cout << endl;
mytree.postorder(mytree.root);
while (1) {}
}