二叉树的遍历
来源:互联网 发布:夏天披肩款式图淘宝网 编辑:程序博客网 时间:2024/05/21 21:01
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100#define TElemType chartypedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//链式存储,用于一般的二叉树//顺序栈typedef struct stack{ BiTree data[MAXSIZE]; int top;}stack;//链式队列typedef struct{ BiTree data; struct LinkNode *next;}LinkNode;typedef struct{ LinkNode *front,*rear;}LinkQueue;//树的操作声明BiTree CreateBiTree(BiTree T);void PreOrder(BiTree T);//先序遍历void InOrder(BiTree T);//中序遍历void PostOrder(BiTree T);//后序遍历void PreOrder2(BiTree T);//非递归的先序遍历void InOrder2(BiTree T);//非递归的中序遍历void PostOrder2(BiTree T);//非递归的后序遍历void LevelOrder(BiTree T);//层次遍历//栈的操作声明void InitStack(stack *S);void Push(stack *S,BiTree T);BiTree Pop(stack *S);//队列的操作声明void InitQueue(LinkQueue *Q);void EnQueue(LinkQueue *Q,BiTree p);BiTree DeQueue(LinkQueue *Q);int main(){ BiTree T; printf("请先序输入结点,空格表示空:\n"); T=CreateBiTree(T); printf("先序输出结果为:"); PreOrder(T);printf("\n"); printf("先序非递归输出结果为:"); PreOrder2(T);printf("\n"); printf("中序递归输出结果为:"); InOrder(T);printf("\n"); printf("中序非递归输出结果为:"); InOrder2(T);printf("\n"); printf("后序输出结果为:"); PostOrder(T);printf("\n"); printf("后序非递归输出结果为:"); PostOrder2(T);printf("\n"); printf("层序输出结果为:"); LevelOrder(T);printf("\n"); return 0;}BiTree CreateBiTree(BiTree T){ char val=getchar(); if(val==' ') { T=NULL; } else { T=(BiTree)malloc(sizeof(BiTNode)); T->data=val; T->lchild=CreateBiTree(T->lchild); T->rchild=CreateBiTree(T->rchild); } return T;}void PreOrder(BiTree T){ if(T) { printf("%c ",T->data); PreOrder(T->lchild); PreOrder(T->rchild); }}void InOrder(BiTree T){ if(T) { InOrder(T->lchild); printf("%c ",T->data); InOrder(T->rchild); }}void PostOrder(BiTree T){ if(T) { PostOrder(T->lchild); PostOrder(T->rchild); printf("%c ",T->data); }}void InitStack(stack *S){ S->top=-1;}void Push(stack *S,BiTree T){ if(S->top==MAXSIZE-1) { printf("栈满"); } else { S->data[++S->top]=T; }}BiTree Pop(stack *S){ BiTree p; if(S->top==-1) { printf("栈空\n"); } else { p=S->data[S->top]; S->top--; return p; }}void PreOrder2(BiTree T){ stack S; InitStack(&S); BiTree p=T; while(p||S.top!=-1) { if(p) { Push(&S,p); printf("%c ",p->data); p=p->lchild; } else { p=Pop(&S); p=p->rchild; } }}void InOrder2(BiTree T){ stack S; InitStack(&S); BiTree p=T; while(p||S.top!=-1) { if(p) { Push(&S,p); p=p->lchild; } else { p=Pop(&S); printf("%c ",p->data); p=p->rchild; } }}void PostOrder2(BiTree T){ stack S; InitStack(&S); int flag[MAXSIZE]; BiTree p=T,q; while(p||S.top!=-1) { while(p) { Push(&S,p); flag[S.top]=0; p=p->lchild; } while(S.top!=-1&&flag[S.top]==1) { p=Pop(&S); printf("%c ",p->data); p=NULL; } if(S.top!=-1&&flag[S.top]!=1) { flag[S.top]=1; q=S.data[S.top]; p=q->rchild; } else break; }}void InitQueue(LinkQueue *Q){ Q->front=Q->rear=(LinkNode*)malloc(sizeof(LinkNode)); Q->front->next=NULL;}void EnQueue(LinkQueue *Q,BiTree p){ LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode)); s->data=p; s->next=NULL; Q->rear->next=s; Q->rear=s;}BiTree DeQueue(LinkQueue *Q){ BiTree p; LinkNode *q; if(Q->front==Q->rear) { printf("队空\n"); } else { q=Q->front->next; p=q->data; Q->front->next=q->next; if(Q->rear==q) { Q->rear=Q->front; } free(q); } return p;}void LevelOrder(BiTree T){ LinkQueue Q; InitQueue(&Q); BiTree p; EnQueue(&Q,T); while(Q.front!=Q.rear) { p=DeQueue(&Q); printf("%c ",p->data); if(p->lchild!=NULL) { EnQueue(&Q,p->lchild); } if(p->rchild!=NULL) { EnQueue(&Q,p->rchild); } }}
运行结果:
阅读全文
0 0
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- JMS Session session = connection.createSession(paramA,paramB) 两个参数不同组合下的含义和区别
- ButterKnife学习
- HDU
- Node.js对Java开发者而言是什么?
- android Gradle 编译Error :Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileColl
- 二叉树的遍历
- Java ActiveMQ 理解JMS 和 ActiveMQ基本使用
- 新增选择器
- TINY Web服务器实例源代码(参考《深入理解计算机系统(第二版)》)
- Java实现二叉树排序
- Spring MVC 传值方式集合
- Android 碎片使用的一些坑
- svn 提交代码时E155004错误(或者svn文件locked)
- Loadrunner 测试https请求配置