主题:树的遍历
这是我写的树的先序非递归遍历二叉树和中序非递归遍历二叉树,编译没有错,建立二叉树也没有错,但是用先序非递归遍历二叉树和中序非递归遍历二叉树输出的是乱码,请求大家帮我看一下,谢了!
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
/*节点结构声明*/
typedef struct node
{
struct node *lch;
int data;
struct node *rch;
}BNode;
BNode *t;
BNode *creat_bt0(); /*创建二叉树*/
void PreOrder(BNode *b); /*先序非递归遍历二叉树*/
void preorder(BNode *p); /*输出二叉树*/
void InOrder(BNode *b); /*中序非递归遍历二叉树*/
int x;
void main()
{int k;
do{
printf("\n\n");
printf("\n\n 1.建立二叉树 ");
printf("\n\n 2.先序非递归遍历二叉树 ");
printf("\n\n 3.中序非递归遍历二叉树 ");
printf("\n\n 4.结束程序 ");
printf("\n------------------------------\n");
printf("\n 请输入你的选择(1,2,3,4):");
scanf("%d",&k);
switch(k)
{
case 1:{
t=creat_bt0();
preorder(t);
}break;
case 2:{
printf("\n 先序非递归遍历二叉树:\n");
PreOrder(t);
}break;
case 3:{
printf("\n 中序非递归遍历二叉树:\n");
InOrder(t);
}break;
case 4:exit(0);
}
}while(k>=1&&k<=4);
}
/*建立二叉树利用二叉树的性质5,借助一维数组s建立二叉树*/
BNode *creat_bt0()
{
int i,j; /*寻找双亲节点和和孩子编号的关系*/
BNode *q,*root,*s[16];
printf("i,x=");
scanf("%d%d",&i,&x); /*输入对应节点的编号与内容*/
while((i!=0)&&(x!=0))
{
q=(BNode *)malloc(sizeof(BNode)); /*产生一个节点*/
q->data=x;
q->lch=NULL;
q->rch=NULL;
s[i]=q;
if(i==1) /*root为全局变量,为树根节但点*/
root=q;
else
{
j=i/2;
if(i%2==0) /*判断是否为左或右孩子*/
s[j]->lch=q;
else
s[j]->rch=q;
}
printf("i,x=");
scanf("%d%d",&i,&x);
}
return root;
}
/*输出二叉树内容*/
void preorder(BNode *p)
{
if(p!=NULL)
{
printf("%d\t",p->data);
preorder(p->lch);
preorder(p->rch);
}
}
void PreOrder(BNode *b)
{
BNode *st[MAXSIZE],*p;
int top=-1;
if(b!=NULL)
{ top++;
st[top]=b;
while(top>-1)
{ p=st[top];
top--;
printf("%c",p->data);
if(p->rch!=NULL)
{
top++;
st[top]=p->rch;
}
if(p->lch!=NULL)
{
top++;
st[top]=p->lch;
}
}
printf("\n");
}
}
void InOrder(BNode *b)
{
BNode *st[MAXSIZE],*p;
int top=-1;
if(b!=NULL)
{ p=b;
while(top>-1||p!=NULL)
{ while(p!=NULL)
{
top++;
st[top]=p;
p=p->lch;
}
if(top>-1)
{
p=st[top];
top--;
printf("%c",p->data);
p=p->rch;
}
}
printf("\n");
}
}
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
/*节点结构声明*/
typedef struct node
{
struct node *lch;
int data;
struct node *rch;
}BNode;
BNode *t;
BNode *creat_bt0(); /*创建二叉树*/
void PreOrder(BNode *b); /*先序非递归遍历二叉树*/
void preorder(BNode *p); /*输出二叉树*/
void InOrder(BNode *b); /*中序非递归遍历二叉树*/
int x;
void main()
{int k;
do{
printf("\n\n");
printf("\n\n 1.建立二叉树 ");
printf("\n\n 2.先序非递归遍历二叉树 ");
printf("\n\n 3.中序非递归遍历二叉树 ");
printf("\n\n 4.结束程序 ");
printf("\n------------------------------\n");
printf("\n 请输入你的选择(1,2,3,4):");
scanf("%d",&k);
switch(k)
{
case 1:{
t=creat_bt0();
preorder(t);
}break;
case 2:{
printf("\n 先序非递归遍历二叉树:\n");
PreOrder(t);
}break;
case 3:{
printf("\n 中序非递归遍历二叉树:\n");
InOrder(t);
}break;
case 4:exit(0);
}
}while(k>=1&&k<=4);
}
/*建立二叉树利用二叉树的性质5,借助一维数组s建立二叉树*/
BNode *creat_bt0()
{
int i,j; /*寻找双亲节点和和孩子编号的关系*/
BNode *q,*root,*s[16];
printf("i,x=");
scanf("%d%d",&i,&x); /*输入对应节点的编号与内容*/
while((i!=0)&&(x!=0))
{
q=(BNode *)malloc(sizeof(BNode)); /*产生一个节点*/
q->data=x;
q->lch=NULL;
q->rch=NULL;
s[i]=q;
if(i==1) /*root为全局变量,为树根节但点*/
root=q;
else
{
j=i/2;
if(i%2==0) /*判断是否为左或右孩子*/
s[j]->lch=q;
else
s[j]->rch=q;
}
printf("i,x=");
scanf("%d%d",&i,&x);
}
return root;
}
/*输出二叉树内容*/
void preorder(BNode *p)
{
if(p!=NULL)
{
printf("%d\t",p->data);
preorder(p->lch);
preorder(p->rch);
}
}
void PreOrder(BNode *b)
{
BNode *st[MAXSIZE],*p;
int top=-1;
if(b!=NULL)
{ top++;
st[top]=b;
while(top>-1)
{ p=st[top];
top--;
printf("%c",p->data);
if(p->rch!=NULL)
{
top++;
st[top]=p->rch;
}
if(p->lch!=NULL)
{
top++;
st[top]=p->lch;
}
}
printf("\n");
}
}
void InOrder(BNode *b)
{
BNode *st[MAXSIZE],*p;
int top=-1;
if(b!=NULL)
{ p=b;
while(top>-1||p!=NULL)
{ while(p!=NULL)
{
top++;
st[top]=p;
p=p->lch;
}
if(top>-1)
{
p=st[top];
top--;
printf("%c",p->data);
p=p->rch;
}
}
printf("\n");
}
}