回复 4楼 九转星河 求助
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE
1024
#define MAXNODE
1024
typedef struct QueueNode
{
char s[MAXSIZE];
/*队列存放数据*/
int front;
/*队列头指针*/
int rear;
/*队列尾指针*/
}QueueNode,*Queue;
typedef struct BiTNode
{
char
data;
struct BiTNode *lchild,*rchild;
/*左右孩子指针*/
}BiTNode,*BiTree;
Queue Init_Queue();
/*队列初始化*/
void In_Queue(Queue q,BiTree bt);
/*入队*/
void OutQueue(Queue q,BiTree* x);
/*出队并取其数据*/
void Destroy_Queue(Queue* q);
/*销毁队列*/
int Empty_Queue(Queue q);
/*判断队列是否为空*/
int Full_Queue(Queue q);
/*判断队列是否为满*/
int Initiate (BiTree bt);
/*初始化二叉树*/
void PreOrder(BiTree bt);
/*前序遍历*/
void InOrder(BiTree bt);
/*中序遍历*/
void PostOrder(BiTree bt);
/*后序遍历*/
void LevelOrder(BiTree bt);
/*层次遍历*/
void NRPreOrder(BiTree bt);
/*非递归前序遍历*/
void NRInOrder(BiTree bt);
/*非递归中序遍历*/
void Destroy (BiTree* bt);
/*销毁二叉树*/
void Visite(char c)
{
printf("%c",c);
}
int main()
/*主函数*/
{
BiTree bt;
printf("请输入数据\n");
Initiate(bt);
printf("\n前序遍历结果:\n");
PreOrder(bt);
printf("\n前序非递归遍历结果:\n");
NRPreOrder(bt);
printf("\n中序遍历结果:\n");
InOrder(bt);
printf("\n中序非递归遍历结果:\n");
NRInOrder(bt);
printf("\n后序遍历结果:\n");
PostOrder(bt);
}
Queue Init_Queue()
{
Queue p=(Queue)malloc(sizeof (QueueNode));
if (p==NULL)
{
puts("申请空间失败!");
return NULL;
}
memset(p->s,0,sizeof(p->s));
p->front=p->rear=0;
return p;
}
void In_Queue(Queue q,BiTree bt)
/*入队*/
{
if (Full_Queue(q))
return ;
++q->rear;
q->rear%=MAXSIZE;
bt->data=q->s[q->rear];
}
void OutQueue(Queue q,BiTree* bt)
/*出队*/
{
if (Empty_Queue(q))
return ;
++q->front;
q->front%=MAXSIZE;
(*bt)->data=q->s[q->front];
}
int Empty_Queue(Queue q)
/*判断队列是否为空*/
{
return q->front==q->rear;
}
void Destroy_Queue(Queue* q)
/*销毁队列*/
{
if (*q)
free(*q);
*q=NULL;
}
int Full_Queue(Queue q)
{
return q->front==q->rear+1;
/*判断是否队满*/
}
int Initiate (BiTree bt)
/*初始化建立二叉树*bt的头结点*/
{
scanf("%d",&bt);
if((bt=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)
return 0;
bt->lchild=NULL;
bt->rchild=NULL;
return 1;
}
void PreOrder(BiTree bt)
/*先序遍历二叉树bt*/
{
if (bt==NULL)
return;
/*递归调用的结束条件*/
Visite(bt->data);
/*访问结点的数据域*/
PreOrder(bt->lchild);
/*先序递归遍历bt的左子树*/
PreOrder(bt->rchild);
/*先序递归遍历bt的右子树*/
}
void InOrder(BiTree bt)
/*中序遍历二叉树bt*/
{
if (bt==NULL)
/*递归调用的结束条件*/
return;
PreOrder(bt->lchild);
/*先序递归遍历bt的左子树*/
Visite(bt->data);
/*访问结点的数据域*/
PreOrder(bt->rchild);
/*先序递归遍历bt的右子树*/
}
void PostOrder(BiTree bt)
/*后序遍历二叉树bt*/
{
if (bt==NULL)
/*递归调用的结束条件*/
return;
PostOrder(bt->lchild);
/*后序递归遍历bt的左子树*/
PostOrder(bt->rchild);
/*后序递归遍历bt的右子树*/
Visite(bt->data);
/*访问结点的数据域*/
}
void LevelOrder(BiTree bt)
/*层次遍历二叉树bt*/
{
Queue q=Init_Queue();
/*队列初始化*/
BiTree x=0;
/*队列暂存数据*/
if (bt==NULL)
return;
In_Queue(q,bt);
/*入队*/
while(!Empty_Queue(q))
/*如果队列不为空*/
{
OutQueue(q,&x);
/*取出队列数据*/
Visite(x->data);
/*访问队首结点的数据域*/
if (x->lchild!=NULL)
/*将队首结点的左孩子结点入队列*/
In_Queue(q, x->lchild);
if (x->rchild!=NULL)
/*将队首结点的右孩子结点入队列*/
In_Queue(q, x->rchild);
}
Destroy_Queue(&q);
}
void NRPreOrder(BiTree bt)
/*非递归先序遍历二叉树*/
{
BiTree stack[MAXSIZE]={0};
BiTree p=NULL;
int top=0;
if(bt==NULL)
return;
p=bt;
while(!(p=NULL&&top==0))
{
while(p!=NULL)
{
/*访问结点的数据域*/
if(top<MAXNODE-1)
/*将当前指针p压栈*/
{
stack[top]=p;
top++;
}
else
{
printf("???");
return;
}
p=p->lchild;
/*指针指向p的左孩子*/
}
if(top<=0)
return;
/*栈空时结束*/
else
{
top--;
Visite(p->data);
p=stack[top];
/*从栈中弹出栈顶元素*/
p=p->rchild;
/*指针指向p的右孩子结点*/
}
}
}
void NRInOrder(BiTree bt)
/*非递归中序遍历二叉树*/
{
BiTree stack[MAXSIZE]={0};
BiTree p=NULL;
int top=0;
if(bt==NULL)
return;
p=bt;
while(!(p=NULL&&top==0))
{
while(p!=NULL)
{
/*访问结点的数据域*/
if(top<MAXNODE-1)
/*将当前指针p压栈*/
{
stack[top]=p;
top++;
}
else
{
printf("???");
return;
}
p=p->lchild;
/*指针指向p的左孩子*/
}
if(top<=0)
return;
/*栈空时结束*/
else
{
top--;
p=stack[top];
/*从栈中弹出栈顶元素*/
Visite(p->data);
p=p->rchild;
/*指针指向p的右孩子结点*/
}
}
}
void Destroy (BiTree *bt)
{
if(*bt)
{
Destroy(&(*bt)->lchild);
Destroy(&(*bt)->rchild);
free(*bt);
}
*bt=NULL;
}
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
谢谢你帮助我补充修改的代码
输入数据我打的也有很多错误
可以再帮我看一下吗
求助