编写层次遍历序列生成二叉树的函数、层次输出二叉树中各结点的值,求树的宽度,在主函数中使用已编写的函数,生成一棵二叉树,输出二叉树中各结点的值,并输出树的宽度。
#include <iostream>
#include <string>
using namespace std;
typedef char datatype;
typedef struct node *pointer;
struct node{
datatype data;
pointer lchild,rchild;
};
typedef pointer bitree;
const int maxsize=100; //队列容量
typedef struct {
datatype data[maxsize];
int front,rear;
} sqqueue; //顺序队列类型
void init_sqqueue(sqqueue *sq) {
sq->front=sq->rear=0;//不能为-1,0~maxsize-1
}
int empty_sqqueue(sqqueue *sq) { //判队空
if(sq->rear==sq->front) return 1;
else return 0;
}
int en_sqqueue(sqqueue *sq,datatype x) { //入队
if((sq->rear+1)%maxsize==sq->front)
{cout<<"队满,不能入队!\n";
return 0;} //上溢
else
{sq->rear=(sq->rear+1)%maxsize;
sq->data[sq->rear]=x;
return 1;}
}
int de_sqqueue(sqqueue *sq,datatype *x) {
if(sq->rear==sq->front)
{cout<<"队空,不能出队!\n";
return 0;} //下溢
else
{sq->front=(sq->front+1)%maxsize;
*x=sq->data[sq->front];
return 1;}
}
bitree level_creat() { //由层次序列生成,返回根指针
char ch; int front,rear; pointer root,s;
pointer Q[maxsize+1]; //非循环队列,有效下标从1到maxsize
root=NULL; //置空二叉树
front=rear=0; //置空队列
while(cin>>ch,ch!='#') {//输入字符,若不是结束符则循环
if(ch!='@') { //非虚结点,建立新结点
s=new node;
s->data=ch;
s->lchild=s->rchild=NULL;
}
else s=NULL;
rear++;Q[rear]=s; //不管结点是否为虚,都要入队
if(rear==1) {root=s;front=1;}//第一个点是根,单独处理
else {
if(s&&Q[front]) //孩子和双亲都不是虚结点,链接之
if(rear%2==0) Q[front]->lchild=s;//rear是偶数,左孩子
else Q[front]->rchild=s;//rear是奇数,右孩子
if(rear%2==1) front++; //不论虚否,右孩子入队后,双亲出队
}
}
return root;
}
int width(bitree t)//计算树的宽度;
{pointer p, Q[maxsize];
int front,rear,b;
int w,count;
if(t==NULL) return 0;
front=rear=-1;
Q[++rear]=t;//将头指针入队
w=1;count=0;b=rear;
while(front<b)
{ front++;p=Q[front];
if(p->lchild!=NULL) {Q[++rear]=p->lchild;count++;}
if(p->rchild!=NULL) {Q[++rear]=p->rchild;count++;}
if(front==b)//双亲结点层最右侧一个结点的有孩子已经扫描入队
{ if(w<count) w=count;
count=0;
b=rear;
}
}
return w;
}
void levelorder(bitree t) { //层次遍历
pointer p;
sqqueue Q;//循环队列,元素为结点指针
if(t==NULL) return;
init_sqqueue(&Q);
en_sqqueue(&Q,t);
while(!empty_sqqueue(&Q)) {
de_sqqueue(&Q,&p);
cout<<p->data<<endl;
if(p->lchild!=NULL) en_sqqueue(&Q,p->lchild);
if(p->rchild!=NULL) en_sqqueue(&Q,p->rchild);
}
}
int main()
{
bitree q;
q=level_creat();
levelorder(q);
cout<<width(q)<<endl;
return 0;
}
错误的提示很明显啊,类型转换错误
请问是哪里类型错误了?求高手指正。
应该怎样修改呢?
int en_sqqueue(sqqueue *sq,datatype x)的x是char类型的,
en_sqqueue(&Q,t);的t是node类型的
应该把en_sqqueue(&Q,t);改成en_sqqueue(&Q,t.data);