/* Inorder traversal with out using recursion */ int top = -1; struct node *arr[100]; struct node { char data; struct node *left; struct node *right; int visited; }; static int postIndex = 6; int search(char in[],int inStrt, int inEnd, char data); struct node *buildTree(char in[], char pre[], int inStrt, int inEnd); struct node* newNode(char data); int search(char arr[], int inStrt, int inEnd, char data) { int i; for(i = inStrt; i <= inEnd; i++) { if(arr[i] == data) { return i; } } } struct node *buildTree(char post[], char in[], int inStrt, int inEnd) { if(inStrt > inEnd) return NULL; // pick the last node from post-order traversal // which happens to be the root struct node *tNode = newNode(post[postIndex--]); // if this node has no childern then return if(inStrt == inEnd) return tNode; // find the index of this node in in-order traversal int inIndex = search(in, inStrt, inEnd, tNode->data); tNode->right = buildTree(post, in, inIndex+1, inEnd); tNode->left = buildTree(post, in, inStrt, inIndex -1); return tNode; } struct node* newNode(char data) { struct node *node = (struct node *)malloc(sizeof(struct node)); node->data = data; node->left = NULL; node->right = NULL; node->visited = 0; return node; } void push (struct node *root) { arr[++top] = root; } struct node *pop(void) { return arr[top--]; } /* Inorder traversal without using recursion */ void printInorder(struct node *root) { struct node *temp; if(root == NULL) return; // Push all node onto the stack while(root != NULL) { push(root); root = root->left; } while(top != -1) { temp = pop(); printf("%c \t", temp->data); temp = temp->right; while(temp != NULL) { push(temp); temp = temp->left; } } printf("top inorder : %d\n", top); } /* Pre-order traversal without using recursion */ void printPreorder(struct node *root) { struct node *temp; if(root == NULL) return 0; while(root != NULL) { printf("%c \t", root->data); push(root); root = root->left; } while(top != -1) { temp = pop(); temp = temp->right; while(temp != NULL) { printf("%c\t", temp->data); push(temp); temp= temp->left; } } } /* Post-order traversal without using recursion */ void printPostorder(struct node *root) { struct node *temp; if(root == NULL) return 0; while(root != NULL) { push(root); root = root->left; } while(top != -1) { temp = pop(); push(temp); //printf("%c %d\n", temp->data, temp->visited); temp = temp->right; while(temp != NULL && temp->visited == 0) { temp->visited = 1; push(temp); temp= temp->left; } temp = pop(); printf("%c\t", temp->data); } } main() { char post[] = {'C', 'F', 'G', 'D', 'B', 'E', 'A'}; char in[] = {'C', 'B', 'F', 'D', 'G', 'A', 'E'}; int len = sizeof(post)/sizeof(post[0]); int i; struct node *root = buildTree(post, in, 0, len-1); printf("Print the in order traversal\n"); printInorder(root); printf("Print the pre-order traversal\n"); printPreorder(root); printf("\nPrint the post-order traversal\n"); printPostorder(root); }
Thursday, September 1, 2011
Tree Traversals without using Recursion
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment