与栈结合的二叉树遍历(c语言)
来源:互联网 发布:5g网络华为和高通 编辑:程序博客网 时间:2024/05/22 12:54
#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define STACK_INIT_SIZE 100#define maxsize 60typedef int Status;typedef struct BitNode{char data;struct BitNode *lchild ,*rchild;}BitNode, *BitTree;typedef struct {int *base;int *top;int stackSize;} SqStack;typedef struct {BitTree *base;BitTree *top;int stackSize;} bitStack;Status InitStack (SqStack &S);Status push(int e,SqStack &S);Status pop(SqStack &S,int &e);Status getTop(SqStack &S);Status StackEmpty(SqStack S);void conversion();void CreateBtree(BitTree &T );void fInOrder(BitTree root);void fPreOrder(BitTree T);void inOrder(BitTree T);void postOrder(BitTree b);int main (){//conversion();BitTree T;CreateBtree(T);//输入树例如(包含空格在里面)//”ABC DE G F “ inOrder(T); printf("\n");fInOrder(T);printf("\n");fPreOrder(T); printf("\n");postOrder(T); return 0;}Status InitStack (SqStack &S){//S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));S.base=new int[maxsize];if(!S.base)return OVERFLOW;S.top=S.base;S.stackSize=maxsize;return OK;}Status InitbitStack (bitStack &S){//S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));S.base=new BitTree[maxsize];if(!S.base)return OVERFLOW;S.top=S.base;S.stackSize=maxsize;return OK;}Status push(SqStack &S,int e){if(S.top-S.base>=S.stackSize){return OVERFLOW;}*S.top++=e;return OK;}Status pushTree(bitStack &S,BitTree e){if(S.top-S.base>=S.stackSize){return OVERFLOW;}*S.top++=e;return OK;}Status pop(SqStack &S,int &e){if(S.top==S.base){return ERROR;}e=*--S.top;return OK;}Status popTree(bitStack &S,BitTree &e){if(S.top==S.base){return ERROR;}e=*--S.top;return OK;}Status getTop(SqStack &S){if(S.top==S.base){return ERROR;}return *(S.top-1);}Status StackEmpty(SqStack S){if(S.base==S.top)return ERROR;return OK;}Status bitStackEmpty(bitStack S){if(S.base==S.top)return ERROR;return OK;}void conversion(){ //栈的小应用,十进制八进制转换SqStack S;InitStack(S);int N=0;scanf("%d",&N);while(N){push(S,N%8);N=N/8;}while (StackEmpty(S)){int e;pop (S,e);printf("%d",e);}printf("w2");}///递归方式遍历void preOrder (BitTree T){if(T){printf("%c",T->data);preOrder(T->lchild);preOrder(T->rchild);}}void inOrder(BitTree T){ if(T){ printf("%c",T->data); preOrder(T->lchild); preOrder(T->rchild); }}void baOrder(BitTree T){ if(T){ printf("%c",T->data); preOrder(T->lchild); preOrder(T->rchild); }}void fInOrder(BitTree p){ ///非递归的中序遍历 bitStack S;InitbitStack(S);while (p!=NULL|| bitStackEmpty(S)){if (p!=NULL){pushTree(S,p);p=p->lchild;}else{ popTree(S,p); printf("%c",p->data); p=p->rchild;}}}void fPreOrder(BitTree b){ BitTree st[maxsize]; BitTree p; int top=-1; if(b!=NULL){ st[++top]=b; //根节点进栈 while(top>-1){ p=st[top--];//出栈并访问该节点; printf("%c",p->data); if(p->rchild!=NULL){st[++top]=p->rchild;}//右孩子节点进栈 if(p->lchild!=NULL){st[++top]=p->lchild;}//左孩子节点进栈 } }}void CreateBtree(BitTree &T ){ //创建二叉树 char ch; scanf("%c",&ch); if(ch==' ') T=NULL; else{ if(!(T=(BitNode * )malloc(sizeof(BitNode)))) exit(OVERFLOW); T->data=ch; CreateBtree(T->lchild); CreateBtree(T->rchild); }}void postOrder(BitTree b){ ///非递归的后序遍历 BitTree st[maxsize]; BitTree p; int flag,top=-1; if(b!=NULL){ do{ while (b!=NULL){ st[++top]=b; b=b->lchild; } p=NULL; flag=1; while(top!=-1&&flag){ b=st[top]; if(b->rchild==p){ printf("%c",b->data); top--; p=b; } else{ b=b->rchild; flag=0; } } }while(top!=-1); }}
1 0
- 与栈结合的二叉树遍历(c语言)
- 二叉树的创建与遍历(C语言实现)
- C语言实现二叉树的遍历
- 数据结构C语言二叉树的遍历
- C语言 二叉树的遍历
- 二叉树的建立与遍历(C语言简单实现)
- 二叉树的遍历(c语言非递归算法)
- 数据结构-二叉树的遍历(类C语言描述)
- C语言之二叉树(包括遍历的实现)
- c语言实现二叉树(BiNodeTree)的建立与先序遍历,中序遍历
- C语言实现二叉树的递归遍历与非递归遍历
- C语言实现二叉树的递归遍历与非递归遍历
- c 语言 二叉树遍历
- C语言 二叉树构建与前中后序遍历
- c语言二叉树简单创建与遍历
- (C++)二叉树的建立与递归方式遍历
- 二叉树的迭代前中后遍历以及不用栈的遍历C语言
- C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- Android 仿qq消息 可拖动回弹的泡泡
- Nodejs初阶之express
- VC++6.0环境下sqlite数据库编程入门
- Oracle 用户管理与权限分配
- 面试之路(7)-BAT面试题之计算机的三大原则
- 与栈结合的二叉树遍历(c语言)
- 【Android问题记录】Android在设置中切换语言后,回到Lanucher为什么会白屏
- 用NodeJS+Express开发WEB应用
- Activiti流程图乱码
- Linux中Nginx的安装和配置方法
- Linux高性能集群搭建(2)---NFS共享文件系统安装配置
- 有外链并不等于好外链!万马奔腾分享何为好外链
- 三位数乘一位数
- FKConsole - Xcode控制台中文显示调整插件