#include <bits/stdc++.h>
using
namespace
std;
struct
TreeNode {
int
key;
TreeNode* left;
TreeNode* right;
TreeNode(
int
data)
{
key = data;
left = NULL;
right = NULL;
}
};
void
print(vector<
int
>& ans)
{
for
(
auto
x : ans) {
cout << x <<
" "
;
}
}
vector<
int
> postorderTraversal(TreeNode* root)
{
vector<
int
> res;
TreeNode* current = root;
while
(current != NULL) {
if
(current->right == NULL) {
res.push_back(current->key);
current = current->left;
}
else
{
TreeNode* predecessor = current->right;
while
(predecessor->left != NULL
&& predecessor->left != current) {
predecessor = predecessor->left;
}
if
(predecessor->left == NULL) {
res.push_back(current->key);
predecessor->left = current;
current = current->right;
}
else
{
predecessor->left = NULL;
current = current->left;
}
}
}
reverse(res.begin(), res.end());
return
res;
}
int
main()
{
TreeNode* root =
new
TreeNode(10);
root->left =
new
TreeNode(20);
root->right =
new
TreeNode(30);
root->right->left =
new
TreeNode(40);
root->right->right =
new
TreeNode(50);
cout <<
"Morris(postorder) Traversal: "
;
vector<
int
> ans = postorderTraversal(root);
print(ans);
return
0;
}