利用通用栈实现对于二叉树的前序、中序、后序的非递归遍历
来源:互联网 发布:双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
- 利用通用栈实现对于二叉树的前序、中序、后序的非递归遍历
- 【二叉树】非递归遍历的通用算法:前序、中序和后序
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树的非递归【前/中/后 序遍历】
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 实现对于二叉树的前序、中序、后序的递归遍历
- 前,中,后序遍历二叉树 (递归 && 非递归的栈 && 非递归非栈的线索二叉树)
- 树和二叉树---C语言利用栈实现二叉树的递归、非递归的前、中、后序遍历
- 二叉树的前序、中序、后序遍历 递归非递归实现
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 二叉树的前序,中序,后序遍历(递归非递归实现)
- 实现二叉树的前序/中序/后序递归、非递归遍历
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 【二叉树遍历算法】——前/中/后序递归与非递归的实现
- JAVA实现二叉树的前、中、后序遍历(递归与非递归)
- 二叉树非递归前、中、后序遍历实现
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- 腾讯关于字符串匹配的面试题
- Java位演算在程序设计中的使用:位掩码(BitMask)
- acm steps1.3.5(排序)
- Android 手机log的一种方式
- c/字符串,字符转数字,数字转字符
- 利用通用栈实现对于二叉树的前序、中序、后序的非递归遍历
- seo专员
- hdu 4737 A Bit Fun(水题)
- 淘宝前后端分离开发模式实践
- 初学者的逆向工程-第一章 CPU概论
- Unity3d NGUI Slider设置游戏背景音乐的音量
- 借助开源项目,学习软件开发
- AtomicInteger简介
- 初级Web API+MySql获取数据