首页 新闻 搜索 专区 学院

遍历序列生成二叉树、输出二叉树

0
悬赏园豆:5 [待解决问题]

编写层次遍历序列生成二叉树的函数、层次输出二叉树中各结点的值,求树的宽度,在主函数中使用已编写的函数,生成一棵二叉树,输出二叉树中各结点的值,并输出树的宽度。

 

#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;
}

 

Mr小区的主页 Mr小区 | 初学一级 | 园豆:61
提问于:2012-11-18 12:43
< >
分享
所有回答(2)
0

错误的提示很明显啊,类型转换错误

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-18 15:51

请问是哪里类型错误了?求高手指正。

支持(0) 反对(0) Mr小区 | 园豆:61 (初学一级) | 2012-11-18 16:34

应该怎样修改呢?

支持(0) 反对(0) Mr小区 | 园豆:61 (初学一级) | 2012-11-18 16:43
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);

魏飞 | 园豆:290 (菜鸟二级) | 2012-11-24 10:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册