#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int totalElem = 8;
typedef struct BST {
int data;
struct BST *left;
struct BST *right;
} nodeBST;
nodeBST* addNode(int data);
void addNodeToBST(nodeBST *root, nodeBST *node);
void traverse(nodeBST *root);
void createBST(int arr[]);
void iterativeInorder(nodeBST *root);
int main()
{
int arr[10] = {20,9,5,15,4,6,30,35};
createBST(arr);
return 0;
}
void MorrisInorder(nodeBST *root) {
nodeBST* current,*pre;
current=root;
while(current!=NULL) {
if(current->left==NULL) {
current=current->right;
}
else {
pre=current->left;
while(pre->right != NULL && pre->right !=current)
pre=pre->right;
if(pre->right==NULL) {
printf("Link %d, %d\n", pre
->data
, current
->data
); pre->right=current;
current=current->left;
}
else {
pre->right=NULL;
current=current->right;
}
}
}
}
// Recursive inorder traverse
void traverse(nodeBST *root)
{
if (root == NULL) {
return;
} else {
traverse(root->left);
traverse(root->right);
}
return;
}
void createBST(int arr[])
{
nodeBST *node;
nodeBST *root;
int i = 0;
for (i = 0; i < totalElem; i++) {
node = addNode(arr[i]);
if (node == NULL) {
return;
}
if (i == 0) {
root = node;
continue;
}
addNodeToBST(root, node);
}
printf("Recursive Inorder:\n"); traverse(root);
printf("\n\nMorris Inorder:\n"); MorrisInorder(root);
printf("\n\nIterative Inorder:\n"); iterativeInorder(root);
}
nodeBST* addNode(int data)
{
nodeBST
*node
= (nodeBST
*)calloc(1, sizeof(nodeBST
));
if (node == NULL) {
return NULL;
}
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void addNodeToBST(nodeBST *root, nodeBST *node)
{
while(root != NULL) {
if (node->data < root->data) {
if (root->left != NULL) {
root = root->left;
} else {
root->left = node;
return;
}
} else {
if (root->right != NULL) {
root = root->right;
} else {
root->right = node;
return;
}
}
}
return;
}
typedef struct stack {
nodeBST* node;
struct stack* next;
} stackNode;
stackNode* head;
stackNode* top;
void createStack()
{
stackNode
* root
= (stackNode
*)malloc(sizeof(stackNode
));
if (root == NULL) {
//ASSERT
}
root->node = NULL;
root->next = NULL;
head = root;
top = root;
}
void push(nodeBST* treeNode)
{
stackNode
* temp
= (stackNode
*)malloc(sizeof(stackNode
)); if (temp == NULL) {
//ASSERT
}
temp->node = treeNode;
temp->next = head->next;
head->next = temp;
top = head->next;
}
int isStackEmpty()
{
if (head->next == NULL) {
return 1;
}
return 0;
}
nodeBST* pop()
{
stackNode* temp;
if (!isStackEmpty()) {
temp = top;
head->next = top->next;
if (head->next == NULL) {
top = head;
} else {
top = head->next;
}
return temp->node;
}
return head->node;
}
// Iterative
// 1) Create an empty stack S.
// 2) Initialize current node as root
// 3) Push the current node to S and set current = current->left until current is NULL
// 4) If current is NULL and stack is not empty then
// a) Pop the top item from stack.
// b) Print the popped item, set current = current->right
// c) Go to step 3.
// 5) If current is NULL and stack is empty then we are done.
void iterativeInorder(nodeBST *root)
{
createStack();
while(1) {
if (root != NULL) {
// Keep pushing in the stack
push(root);
root = root->left;
} else {
if (isStackEmpty()) {
break;
}
root = pop();
root = root->right;
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgoKCmludCB0b3RhbEVsZW0gPSA4OwoKdHlwZWRlZiBzdHJ1Y3QgQlNUIHsKICAgIGludCBkYXRhOwogICAgc3RydWN0IEJTVCAqbGVmdDsKICAgIHN0cnVjdCBCU1QgKnJpZ2h0Owp9IG5vZGVCU1Q7Cgpub2RlQlNUKiBhZGROb2RlKGludCBkYXRhKTsKdm9pZCBhZGROb2RlVG9CU1Qobm9kZUJTVCAqcm9vdCwgbm9kZUJTVCAqbm9kZSk7CnZvaWQgdHJhdmVyc2Uobm9kZUJTVCAqcm9vdCk7CnZvaWQgY3JlYXRlQlNUKGludCBhcnJbXSk7CnZvaWQgaXRlcmF0aXZlSW5vcmRlcihub2RlQlNUICpyb290KTsKCmludCBtYWluKCkKewogICAgaW50IGFyclsxMF0gPSB7MjAsOSw1LDE1LDQsNiwzMCwzNX07CgogICAgY3JlYXRlQlNUKGFycik7CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQgTW9ycmlzSW5vcmRlcihub2RlQlNUICpyb290KSB7CiAgICBub2RlQlNUKiBjdXJyZW50LCpwcmU7CiAgICBjdXJyZW50PXJvb3Q7CiAgICB3aGlsZShjdXJyZW50IT1OVUxMKSB7CiAgICAgICAgaWYoY3VycmVudC0+bGVmdD09TlVMTCkgewogICAgICAgICAgICBwcmludGYoIiVkICIsY3VycmVudC0+ZGF0YSk7CiAgICAgICAgICAgIGN1cnJlbnQ9Y3VycmVudC0+cmlnaHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmU9Y3VycmVudC0+bGVmdDsKICAgICAgICAgICAgd2hpbGUocHJlLT5yaWdodCAhPSBOVUxMICYmIHByZS0+cmlnaHQgIT1jdXJyZW50KQogICAgICAgICAgICAgICAgcHJlPXByZS0+cmlnaHQ7CiAgICAgICAgICAgIGlmKHByZS0+cmlnaHQ9PU5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiTGluayAlZCwgJWRcbiIsIHByZS0+ZGF0YSwgY3VycmVudC0+ZGF0YSk7CiAgICAgICAgICAgICAgICBwcmUtPnJpZ2h0PWN1cnJlbnQ7CiAgICAgICAgICAgICAgICBjdXJyZW50PWN1cnJlbnQtPmxlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwcmUtPnJpZ2h0PU5VTEw7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkICIsY3VycmVudC0+ZGF0YSk7CiAgICAgICAgICAgICAgICBjdXJyZW50PWN1cnJlbnQtPnJpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyBSZWN1cnNpdmUgaW5vcmRlciB0cmF2ZXJzZQp2b2lkIHRyYXZlcnNlKG5vZGVCU1QgKnJvb3QpCnsKICAgIGlmIChyb290ID09IE5VTEwpIHsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIHRyYXZlcnNlKHJvb3QtPmxlZnQpOwogICAgICAgIHByaW50ZigiJWQgIiwgcm9vdC0+ZGF0YSk7CiAgICAgICAgdHJhdmVyc2Uocm9vdC0+cmlnaHQpOwogICAgfQoKICAgIHJldHVybjsKfQoKdm9pZCBjcmVhdGVCU1QoaW50IGFycltdKQp7CiAgICBub2RlQlNUICpub2RlOwogICAgbm9kZUJTVCAqcm9vdDsKICAgIGludCBpID0gMDsKICAgIAogICAgZm9yIChpID0gMDsgaSA8IHRvdGFsRWxlbTsgaSsrKSB7CiAgICAgICAgbm9kZSA9IGFkZE5vZGUoYXJyW2ldKTsKICAgICAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgcm9vdCA9IG5vZGU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgYWRkTm9kZVRvQlNUKHJvb3QsIG5vZGUpOwogICAgfQoKICAgIHByaW50ZigiUmVjdXJzaXZlIElub3JkZXI6XG4iKTsKICAgIHRyYXZlcnNlKHJvb3QpOwogICAgcHJpbnRmKCJcblxuTW9ycmlzIElub3JkZXI6XG4iKTsKICAgIE1vcnJpc0lub3JkZXIocm9vdCk7CiAgICBwcmludGYoIlxuXG5JdGVyYXRpdmUgSW5vcmRlcjpcbiIpOwogICAgaXRlcmF0aXZlSW5vcmRlcihyb290KTsKfQoKbm9kZUJTVCogYWRkTm9kZShpbnQgZGF0YSkKewogICAgbm9kZUJTVCAqbm9kZSA9IChub2RlQlNUKiljYWxsb2MoMSwgc2l6ZW9mKG5vZGVCU1QpKTsKCiAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgbm9kZS0+ZGF0YSA9IGRhdGE7CiAgICBub2RlLT5sZWZ0ID0gTlVMTDsKICAgIG5vZGUtPnJpZ2h0ID0gTlVMTDsKCiAgICByZXR1cm4gbm9kZTsKfQoKdm9pZCBhZGROb2RlVG9CU1Qobm9kZUJTVCAqcm9vdCwgbm9kZUJTVCAqbm9kZSkKewogICAgd2hpbGUocm9vdCAhPSBOVUxMKSB7CiAgICAgICAgaWYgKG5vZGUtPmRhdGEgPCByb290LT5kYXRhKSB7CiAgICAgICAgICAgIGlmIChyb290LT5sZWZ0ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHJvb3QgPSByb290LT5sZWZ0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcm9vdC0+bGVmdCA9IG5vZGU7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocm9vdC0+cmlnaHQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgcm9vdCA9IHJvb3QtPnJpZ2h0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcm9vdC0+cmlnaHQgPSBub2RlOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKdHlwZWRlZiBzdHJ1Y3Qgc3RhY2sgewogICAgbm9kZUJTVCogbm9kZTsKICAgIHN0cnVjdCBzdGFjayogbmV4dDsKfSBzdGFja05vZGU7CgpzdGFja05vZGUqIGhlYWQ7CnN0YWNrTm9kZSogdG9wOwoKdm9pZCBjcmVhdGVTdGFjaygpCnsKICAgIHN0YWNrTm9kZSogcm9vdCA9IChzdGFja05vZGUqKW1hbGxvYyhzaXplb2Yoc3RhY2tOb2RlKSk7CgogICAgaWYgKHJvb3QgPT0gTlVMTCkgewogICAgICAgIC8vQVNTRVJUCiAgICB9CgogICAgcm9vdC0+bm9kZSA9IE5VTEw7CiAgICByb290LT5uZXh0ID0gTlVMTDsKCiAgICBoZWFkID0gcm9vdDsKICAgIHRvcCA9IHJvb3Q7Cn0KCnZvaWQgcHVzaChub2RlQlNUKiB0cmVlTm9kZSkKewogICAgc3RhY2tOb2RlKiB0ZW1wID0gKHN0YWNrTm9kZSopbWFsbG9jKHNpemVvZihzdGFja05vZGUpKTsKICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAvL0FTU0VSVAogICAgfQoKICAgIHRlbXAtPm5vZGUgPSB0cmVlTm9kZTsKICAgIHRlbXAtPm5leHQgPSBoZWFkLT5uZXh0OwogICAgaGVhZC0+bmV4dCA9IHRlbXA7CgogICAgdG9wID0gaGVhZC0+bmV4dDsKfQoKaW50IGlzU3RhY2tFbXB0eSgpCnsKICAgIGlmIChoZWFkLT5uZXh0ID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKbm9kZUJTVCogcG9wKCkKewogICAgc3RhY2tOb2RlKiB0ZW1wOwoKICAgIGlmICghaXNTdGFja0VtcHR5KCkpIHsKICAgICAgICB0ZW1wID0gdG9wOwogICAgICAgIGhlYWQtPm5leHQgPSB0b3AtPm5leHQ7CgogICAgICAgIGlmIChoZWFkLT5uZXh0ID09IE5VTEwpIHsKICAgICAgICAgICAgdG9wID0gaGVhZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b3AgPSBoZWFkLT5uZXh0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRlbXAtPm5vZGU7CiAgICB9CgogICAgcmV0dXJuIGhlYWQtPm5vZGU7Cn0KCi8vIEl0ZXJhdGl2ZQovLyAxKSBDcmVhdGUgYW4gZW1wdHkgc3RhY2sgUy4KLy8gMikgSW5pdGlhbGl6ZSBjdXJyZW50IG5vZGUgYXMgcm9vdAovLyAzKSBQdXNoIHRoZSBjdXJyZW50IG5vZGUgdG8gUyBhbmQgc2V0IGN1cnJlbnQgPSBjdXJyZW50LT5sZWZ0IHVudGlsIGN1cnJlbnQgaXMgTlVMTAovLyA0KSBJZiBjdXJyZW50IGlzIE5VTEwgYW5kIHN0YWNrIGlzIG5vdCBlbXB0eSB0aGVuIAovLyAgICAgIGEpIFBvcCB0aGUgdG9wIGl0ZW0gZnJvbSBzdGFjay4KLy8gICAgICBiKSBQcmludCB0aGUgcG9wcGVkIGl0ZW0sIHNldCBjdXJyZW50ID0gY3VycmVudC0+cmlnaHQKLy8gICAgICBjKSBHbyB0byBzdGVwIDMuCi8vIDUpIElmIGN1cnJlbnQgaXMgTlVMTCBhbmQgc3RhY2sgaXMgZW1wdHkgdGhlbiB3ZSBhcmUgZG9uZS4KCnZvaWQgaXRlcmF0aXZlSW5vcmRlcihub2RlQlNUICpyb290KQp7CiAgICBjcmVhdGVTdGFjaygpOwoKICAgIHdoaWxlKDEpIHsKICAgICAgICBpZiAocm9vdCAhPSBOVUxMKSB7CiAgICAgICAgICAgIC8vIEtlZXAgcHVzaGluZyBpbiB0aGUgc3RhY2sKICAgICAgICAgICAgcHVzaChyb290KTsKICAgICAgICAgICAgcm9vdCA9IHJvb3QtPmxlZnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGlzU3RhY2tFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcm9vdCA9IHBvcCgpOwogICAgICAgICAgICBwcmludGYoIiVkICIsIHJvb3QtPmRhdGEpOwoKICAgICAgICAgICAgcm9vdCA9IHJvb3QtPnJpZ2h0OwogICAgICAgIH0KICAgIH0KfQo=