/*
* File: morrisinorder.c
* Author: srkrishnan
*
* Created on July 5, 2011, 7:28 AM
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Tnode {
int data;
struct Tnode *left;
struct Tnode *right;
struct Tnode *next;
} Tnode;
Tnode* createnode(int data) {
Tnode *n = (Tnode*) malloc(sizeof (Tnode));
n->left = n->right =n->next= NULL;
n->data = data;
return n;
}
inordermorrisiterative(Tnode *root) {
Tnode *current = root, *pred = NULL, *succesor = NULL;
while (current != NULL) {
succesor = current->right;
if (succesor != NULL && current->next==NULL) {
while (succesor->left != NULL) {
succesor = succesor->left;
}
current->next = succesor;
}
if (current->left == NULL) {
printf(" %d ", current->data);
current = current->right;
} else {
pred = current->left;
while (pred->right != NULL && pred->right != current) {
pred = pred->right;
}
if (pred->right == NULL) {
pred->next = current;
pred->right = current;
current = current->left;
} else {
pred->right = NULL;
printf(" %d ", current->data);
current = current->right;
}
}
}
}
void printinorder(Tnode *root) {
while(root->left!=NULL)
root=root->left;
while (root!= NULL) {
printf(" %d ", root->data);
root = root->next;
}
}
int main(int argc, char** argv) {
Tnode *root;
root = createnode(15);
root->left = createnode(7);
root->right = createnode(25);
root->left->left = createnode(3);
root->left->right = createnode(10);
root->right->left = NULL;
root->right->right = createnode(50);
root->left->right->left = createnode(8);
root->left->right->right = createnode(12);
root->left->right->left->left = NULL;
root->left->right->left->right = createnode(9);
root->left->right->right->left = createnode(11);
root->left->right->right->right = createnode(14);
root->right->right->left = createnode(30);
root->right->right->right = createnode(55);
root->right->right->right->left = createnode(52);
root->right->right->right->right = NULL;
inordermorrisiterative(root);
printf("\n");
printinorder(root);
return (EXIT_SUCCESS);
}