二叉树层次遍历的一个错误。
代码如下:#include<stdio.h>#include<malloc.h>//#include<assert.h>typedefcharelemptype;type...
代码如下:#include<stdio.h>
#include<malloc.h>
//#include<assert.h>
typedef char elemptype;
typedef struct bnode
{
elemptype data;
struct bnode *lchild;
struct bnode *rchild;
}bnode,*bitree;
typedef struct qnode
{
bitree bnode;
bitree data;
struct qnode *next;
}qnode;
typedef struct
{
qnode *front;
qnode *rear;
}linkqueue;
void Initqueue(linkqueue *Q);
void Inqueue(linkqueue *Q,bitree *data);
bitree Deletequeue(linkqueue *Q);
void BTlayer(bitree root)
{
linkqueue Q;
bitree P=root;
if(root)
Inqueue(&Q,&P);
else
printf("根节点为空,请重新输入.");
Initqueue(&Q);
Inqueue(&Q,&P);
while(Q.front)
{
P=Deletequeue(&Q);
printf("%c",P->data);
if(P->lchild)
Inqueue(&Q,&P->lchild);
if(P->rchild)
Inqueue(&Q,&P->rchild);
}
}
void Initqueue(linkqueue *Q)
{
Q->front=Q->rear=(qnode *)malloc(sizeof(qnode));
Q->front->next=NULL;
}
void Inqueue(linkqueue *Q,bitree *data)
{
qnode *pNode;
pNode=(qnode *)malloc(sizeof(qnode));
pNode->data=*data;
pNode->next=NULL;
Q->rear->next=pNode;
Q->rear=pNode;
}
bitree Deletequeue(linkqueue *Q)
{
qnode *p;
bitree *pData;
//Q->front!=Q->rear;
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear=Q->front;
}
pData=&p->data;
free(p);
return *pData;
}
bitree CreateBit()
{
char ch;
bitree T;
scanf("%c",&ch);
if(ch==' ')
return (0);
else
{
T=(bitree)malloc(sizeof(bnode));
T->data=ch;
T->lchild=CreateBit();
T->rchild=CreateBit();
return (T);
}
}
void Inorder(bitree root)
{
if(root!=0)
{
Inorder(root->lchild);
printf("%c",root->data);
Inorder(root->rchild);
}
}
void Preorder(bitree root)
{
if(root!=0)
{
printf("%c",root->data);
Preorder(root->lchild);
Preorder(root->rchild);
}
}
void Lastorder(bitree root)
{
if(root!=0)
{
Lastorder(root->lchild);
Lastorder(root->rchild);
printf("%c",root->data);
}
}
main()
{
bitree p,root;
printf("\n请输入二叉树的前序扩展序列\n");
root=p=CreateBit();
printf("\n前序遍历的结果为:");
Preorder(root);
root=p;
printf("\n中序遍历的结果为:");
Inorder(root);
root=p;
printf("\n后续遍历的结果为: ");
Lastorder(root);
printf("\n层次遍历的结果为: ");
BTlayer(root);
}
求高手解答,始终不知道是哪里出错了,编译没错也没警告,但是执行就是有错误。 展开
#include<malloc.h>
//#include<assert.h>
typedef char elemptype;
typedef struct bnode
{
elemptype data;
struct bnode *lchild;
struct bnode *rchild;
}bnode,*bitree;
typedef struct qnode
{
bitree bnode;
bitree data;
struct qnode *next;
}qnode;
typedef struct
{
qnode *front;
qnode *rear;
}linkqueue;
void Initqueue(linkqueue *Q);
void Inqueue(linkqueue *Q,bitree *data);
bitree Deletequeue(linkqueue *Q);
void BTlayer(bitree root)
{
linkqueue Q;
bitree P=root;
if(root)
Inqueue(&Q,&P);
else
printf("根节点为空,请重新输入.");
Initqueue(&Q);
Inqueue(&Q,&P);
while(Q.front)
{
P=Deletequeue(&Q);
printf("%c",P->data);
if(P->lchild)
Inqueue(&Q,&P->lchild);
if(P->rchild)
Inqueue(&Q,&P->rchild);
}
}
void Initqueue(linkqueue *Q)
{
Q->front=Q->rear=(qnode *)malloc(sizeof(qnode));
Q->front->next=NULL;
}
void Inqueue(linkqueue *Q,bitree *data)
{
qnode *pNode;
pNode=(qnode *)malloc(sizeof(qnode));
pNode->data=*data;
pNode->next=NULL;
Q->rear->next=pNode;
Q->rear=pNode;
}
bitree Deletequeue(linkqueue *Q)
{
qnode *p;
bitree *pData;
//Q->front!=Q->rear;
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear=Q->front;
}
pData=&p->data;
free(p);
return *pData;
}
bitree CreateBit()
{
char ch;
bitree T;
scanf("%c",&ch);
if(ch==' ')
return (0);
else
{
T=(bitree)malloc(sizeof(bnode));
T->data=ch;
T->lchild=CreateBit();
T->rchild=CreateBit();
return (T);
}
}
void Inorder(bitree root)
{
if(root!=0)
{
Inorder(root->lchild);
printf("%c",root->data);
Inorder(root->rchild);
}
}
void Preorder(bitree root)
{
if(root!=0)
{
printf("%c",root->data);
Preorder(root->lchild);
Preorder(root->rchild);
}
}
void Lastorder(bitree root)
{
if(root!=0)
{
Lastorder(root->lchild);
Lastorder(root->rchild);
printf("%c",root->data);
}
}
main()
{
bitree p,root;
printf("\n请输入二叉树的前序扩展序列\n");
root=p=CreateBit();
printf("\n前序遍历的结果为:");
Preorder(root);
root=p;
printf("\n中序遍历的结果为:");
Inorder(root);
root=p;
printf("\n后续遍历的结果为: ");
Lastorder(root);
printf("\n层次遍历的结果为: ");
BTlayer(root);
}
求高手解答,始终不知道是哪里出错了,编译没错也没警告,但是执行就是有错误。 展开
2个回答
2011-05-04
展开全部
#include<stdio.h>
#include<malloc.h>
//二叉链表的结构类型定义
const int maxsize=1024;
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
}bitree;
bitree*creattree();
void preorder(bitree*);
void main()
{
bitree*pb;
pb=creattree();
preorder(pb);
printf("\n");
}
//二叉树的建立
bitree*creattree()
{
char ch;
bitree*Q[maxsize];
int front,rear;
bitree*root,*s;
root=NULL;
front=1;rear=0;
printf("按层次输入二叉树,虚结点输入'@',以'#'结束输入:\n");
while((ch=getchar())!='#')
{
s=NULL;
if(ch!='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)root=s;
else
{
if(s&&Q[front])
if(rear%2==0)Q[front]->lchild=s;
else Q[front]->rchild=s;
if(rear%2==1)front++;
}
}
return root;
}
//先序遍历按层次输出二叉树
void preorder(bitree*p)
{
if(p!=NULL)
{
printf("%c",p->data);
if(p->lchild!=NULL||p->rchild!=NULL)
{
printf("(");
preorder(p->lchild);
if(p->rchild!=NULL)printf(",");
preorder(p->rchild);
printf(")");
}
}
}
//这个是不论输入多少个结点的,我想你应该会改成10个的吧,我就不改了。
//你所说的是先序遍历,就是最后的这个子程序
另外,团IDC网上有许多产品团购,便宜有口碑
#include<malloc.h>
//二叉链表的结构类型定义
const int maxsize=1024;
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
}bitree;
bitree*creattree();
void preorder(bitree*);
void main()
{
bitree*pb;
pb=creattree();
preorder(pb);
printf("\n");
}
//二叉树的建立
bitree*creattree()
{
char ch;
bitree*Q[maxsize];
int front,rear;
bitree*root,*s;
root=NULL;
front=1;rear=0;
printf("按层次输入二叉树,虚结点输入'@',以'#'结束输入:\n");
while((ch=getchar())!='#')
{
s=NULL;
if(ch!='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)root=s;
else
{
if(s&&Q[front])
if(rear%2==0)Q[front]->lchild=s;
else Q[front]->rchild=s;
if(rear%2==1)front++;
}
}
return root;
}
//先序遍历按层次输出二叉树
void preorder(bitree*p)
{
if(p!=NULL)
{
printf("%c",p->data);
if(p->lchild!=NULL||p->rchild!=NULL)
{
printf("(");
preorder(p->lchild);
if(p->rchild!=NULL)printf(",");
preorder(p->rchild);
printf(")");
}
}
}
//这个是不论输入多少个结点的,我想你应该会改成10个的吧,我就不改了。
//你所说的是先序遍历,就是最后的这个子程序
另外,团IDC网上有许多产品团购,便宜有口碑
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询