#include<iostream>
#include<vector>
using namespace std;
//Node Structure
class Node {
public:
int data;
Node* left;
Node* right;
Node(int x) {
data = x;
left = right = nullptr;
}
};
vector<int> inOrder(Node* root) {
vector<int> res;
Node* curr = root;
while(curr != nullptr) {
if(curr->left == nullptr) {
//if no left child, visit this node
//and go right
res.push_back(curr->data);
curr = curr->right;
}
else {
//Find the inorder predecessor of curr
Node* prev = curr->left;
while(prev->right!= nullptr && prev->right!= curr) {
prev = prev->right;
}
if(prev->right == nullptr) {
prev->right = curr;
curr = curr->left;
}
else {
//Revert the changes made in the tree
prev->right = nullptr;
res.push_back(curr->data);
curr = curr->right;
}
}
}
return res;
}
int main() {
Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
vector<int> res = inOrder(root);
for(int data:res) {
cout << data << " ";
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vTm9kZSBTdHJ1Y3R1cmUKY2xhc3MgTm9kZSB7CnB1YmxpYzoKCWludCBkYXRhOwoJTm9kZSogbGVmdDsKCU5vZGUqIHJpZ2h0OwoJCglOb2RlKGludCB4KSB7CgkJZGF0YSA9IHg7CgkJbGVmdCA9IHJpZ2h0ID0gbnVsbHB0cjsKCX0KCQp9OwoKCnZlY3RvcjxpbnQ+IGluT3JkZXIoTm9kZSogcm9vdCkgewoJdmVjdG9yPGludD4gcmVzOwoJCglOb2RlKiBjdXJyID0gcm9vdDsKCQoJd2hpbGUoY3VyciAhPSBudWxscHRyKSB7CgkJaWYoY3Vyci0+bGVmdCA9PSBudWxscHRyKSB7CgkJCQoJCQkvL2lmIG5vIGxlZnQgY2hpbGQsIHZpc2l0IHRoaXMgbm9kZSAKCQkJLy9hbmQgZ28gcmlnaHQKCQkJcmVzLnB1c2hfYmFjayhjdXJyLT5kYXRhKTsKCQkJY3VyciA9IGN1cnItPnJpZ2h0OwoJCX0KCQllbHNlIHsKCQkJLy9GaW5kIHRoZSBpbm9yZGVyIHByZWRlY2Vzc29yIG9mIGN1cnIKCQkJTm9kZSogcHJldiA9IGN1cnItPmxlZnQ7CgkJCQoJCQl3aGlsZShwcmV2LT5yaWdodCE9IG51bGxwdHIgJiYgcHJldi0+cmlnaHQhPSBjdXJyKSB7CgkJCQlwcmV2ID0gcHJldi0+cmlnaHQ7CgkJCQkKCQkJfQoJCQkKCQkJaWYocHJldi0+cmlnaHQgPT0gbnVsbHB0cikgewoJCQkJcHJldi0+cmlnaHQgPSBjdXJyOwoJCQkJY3VyciA9IGN1cnItPmxlZnQ7CgkJCX0KCQkJZWxzZSB7CgkJCQkvL1JldmVydCB0aGUgY2hhbmdlcyBtYWRlIGluIHRoZSB0cmVlCgkJCQlwcmV2LT5yaWdodCA9IG51bGxwdHI7CgkJCQlyZXMucHVzaF9iYWNrKGN1cnItPmRhdGEpOwoJCQkJY3VyciA9IGN1cnItPnJpZ2h0OwoJCQl9CgkJCQoJCX0KCQkKCX0KCQoJcmV0dXJuIHJlczsKCQp9CgppbnQgbWFpbigpIHsKCQoJTm9kZSogcm9vdCA9IG5ldyBOb2RlKDEpOwoJcm9vdC0+bGVmdCA9IG5ldyBOb2RlKDIpOwoJcm9vdC0+cmlnaHQgPSBuZXcgTm9kZSgzKTsKCXJvb3QtPmxlZnQtPmxlZnQgPSBuZXcgTm9kZSg0KTsKCXJvb3QtPmxlZnQtPnJpZ2h0ID0gbmV3IE5vZGUoNSk7CgkKCXZlY3RvcjxpbnQ+IHJlcyA9IGluT3JkZXIocm9vdCk7CgkKCWZvcihpbnQgZGF0YTpyZXMpIHsKCQljb3V0IDw8IGRhdGEgPDwgIiAiOwoJfQp9