利用通用栈实现对于二叉树的前序、中序、后序的非递归遍历

来源:互联网 发布:双j恋 知乎 编辑:程序博客网 时间:2024/05/29 18:04

利用通用栈实现对于二叉树的前序、中序、后序的非递归遍历

/*** filename: Btree_visit.c** 利用非递归的方法实现对二叉树的三种遍历** time: 2014-8-15** ***/#include <stdio.h>#include <stdlib.h>#define  list_entry(type, pos, member)  (type *)((char *)(pos) - (int)(&((type *)0)->member))typedef struct node{    struct node *next;}Linklist;typedef struct Bnode{int data;struct Bnode *lchild;struct Bnode *rchild;Linklist bnode;}Btree;int isEmpty(Linklist *s){    if(s->next == NULL)   return 1;    else        return 0;    // return (NULL == s->next);}void initial_stack(Linklist *s){    s->next = NULL;}void push(Linklist *s, Linklist *q){  if(s!=NULL && q!=NULL)    {        q->next = s->next;        s->next = q;    }}Linklist *pop(Linklist *s){    Linklist *p;    if(isEmpty(s)) //if(S->next == NULL)        return NULL;    p = s->next;    s->next = p->next;    return p;}Linklist  *get_top(Linklist *s){Linklist *p;if(isEmpty(s))return  NULL;p = s->next;return p;}Btree *create(){Btree *t = NULL ;int num;scanf("%d", &num);if(num > 0){t = (Btree *)malloc(sizeof(Btree));t->data = num;t->lchild = create();t->rchild = create();}return t;}void Preorder_Traverse(Btree *t){Linklist s, *h;Btree *tt;if(t == NULL) return ;  initial_stack(&s);push(&s, &(t->bnode)); //first node push stackwhile( !(isEmpty(&s)) )   {h = pop(&s);      //pop stacktt = list_entry(Btree, h, bnode);printf("%d ", tt->data);if(tt->rchild != NULL)   //visit it's rchild and push stackpush(&s, &(tt->rchild->bnode));if(tt->lchild != NULL)  //visit it's lchild and push stackpush(&s, &(tt->lchild->bnode));}}void Inorder_Traverse(Btree *t){ Linklist s, *h;     Btree *tt;    if(t== NULL) return ;   initial_stack(&s);while(t!=NULL || !isEmpty(&s)){while(t != NULL){    push(&s, &(t->bnode));  //first node push stackt = t->lchild; //traverse it's lchild node until NULL}if(!isEmpty(&s)){       h = pop(&s);        //pop stack       tt = list_entry(Btree, h, bnode);       printf("%d ", tt->data);t = tt ->rchild;// back to root node's rchild }}}void Postorder_Traverse(Btree *t)   { Linklist s,  *h;     Btree *tt, *cur, *ptr=NULL;    if(t== NULL) return ;   initial_stack(&s);push(&s, &(t->bnode));while( !(isEmpty(&s))){h = get_top(&s);  //change node typecur = list_entry(Btree, h, bnode);//if current node has no child or child node has been visited, pop if( (cur->lchild == NULL && cur->rchild == NULL)|| ((ptr!=NULL)&&(ptr==cur->lchild || ptr==cur->rchild)) ){h = pop(&s);      //pop stacktt = list_entry(Btree, h, bnode);printf("%d ", tt->data);ptr=cur;}else{if(cur->rchild!=NULL) push(&s, &(cur->rchild->bnode));if(cur->lchild!=NULL) push(&s, &(cur->lchild->bnode));}}}int main(){Btree *t =NULL;printf("Input number to create a tree:\n");t = create();printf("\nPreorder Traverse:\t");Preorder_Traverse(t);printf("\nInorder Traverse:\t");Inorder_Traverse(t);printf("\nPostorder Traverse:\t");Postorder_Traverse(t);printf("\n");return 0;}


0 0
原创粉丝点击