It looks like it might work, but it requires marks on the nodes. So it's not what you want. Here is the algorithm for _all_ the orders:
void si(NODE *tree) { restart: while (tree) { printf("preorder %d\n", tree->val); PUSH(tree, 0); tree = tree->left; } while (sp) { if (POP(tree) == 0) { printf("inorder %d\n", tree->val); PUSH(tree, 1); tree = tree->right; goto restart; } printf("postorder %d\n", tree->val); } } On Jun 19, 10:59 am, divya jain <sweetdivya....@gmail.com> wrote: > /* > Assuming you have a stack setup with push() and pop() operations. > Also assuming that all nodes are initially marked to 0. > (This function will reset them back to zero when finished) > */ > void postorder(Node *n) { > push(n); > > while (stack.size > 0) { > n = (Node*)pop(); > > if (n->marked || (n->left == NULL && n->right == NULL)) { > n->marked = 0; > printf("%d\n", n->value); > } > else { > n->marked = 1; > push(n); > > if (n->right) push(n->right); > if (n->left) push(n->left); > } > } > > } > > is the above solution fine for postorder. plz let me knw if there is any > mistake........ > > On 17 June 2010 10:37, Gene <gene.ress...@gmail.com> wrote: > > > > > On Jun 16, 3:01 pm, divya <sweetdivya....@gmail.com> wrote: > > > plz give algos of inorder, preorder nd post order tree traversal..non > > > recursive one..using stack.. > > > nd the tree is not threaded > > > #include <stdio.h> > > #include <stdlib.h> > > > typedef struct node_s { > > int val; > > struct node_s *left, *right; > > } NODE; > > > NODE *new(int val) > > { > > NODE *tree = malloc(sizeof(NODE)); > > tree->val = val; > > tree->left = tree->right = NULL; > > return tree; > > } > > > void search(NODE *tree) > > { > > if (tree) { > > printf("preorder %d\n", tree->val); > > search(tree->left); > > printf("inorder %d\n", tree->val); > > search(tree->right); > > printf("postorder %d\n", tree->val); > > } > > } > > > // Direct conversion of recursive code to iteration. > > struct stack_elt_s { > > int site; > > NODE *tree; > > } stack[100]; > > int sp = 0; > > > void search_iterative(NODE *tree) { > > start: > > if (tree) { > > printf("preorder %d\n", tree->val); > > // simulate the recursive call search(tree->left) > > stack[sp].tree = tree; > > stack[sp++].site = 0; > > tree = tree->left; > > goto start; > > L0: > > printf("inorder %d\n", tree->val); > > // simulate the recursive call search(tree->right) > > stack[sp].tree = tree; > > stack[sp++].site = 1; > > tree = tree->right; > > goto start; > > L1: > > printf("postorder %d\n", tree->val); > > } > > // simulate return to last call site > > if (sp) { > > tree = stack[--sp].tree; > > switch (stack[sp].site) { > > case 0: goto L0; > > case 1: goto L1; > > } > > } > > } > > > int main(void) > > { > > struct node_s *n0 = new(0); > > struct node_s *n1 = new(1); > > struct node_s *n2 = new(2); > > struct node_s *n3 = new(3); > > struct node_s *n4 = new(4); > > n0->left = n1; > > n0->right = n2; > > n1->left = n3; > > n2->left = n4; > > > printf("recusive:\n"); > > search(n0); > > > printf("\nnow iterative:\n"); > > search_iterative(n0); > > > return 0; > > } > > > -- > > You received this message because you are subscribed to the Google Groups > > "Algorithm Geeks" group. > > To post to this group, send email to algoge...@googlegroups.com. > > To unsubscribe from this group, send email to > > algogeeks+unsubscr...@googlegroups.com<algogeeks%2bunsubscr...@googlegroups > > .com> > > . > > For more options, visit this group at > >http://groups.google.com/group/algogeeks?hl=en. -- You received this message because you are subscribed to the Google Groups "Algorithm Geeks" group. To post to this group, send email to algoge...@googlegroups.com. To unsubscribe from this group, send email to algogeeks+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/algogeeks?hl=en.