首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

二叉树有关问题,求帮助.谢谢

2012-04-14 
二叉树问题,求帮助......多谢!今天写了一个二叉树的一些基本算法。有层次建立,先根建立,中根建立,后根建立,

二叉树问题,求帮助......多谢!
今天写了一个二叉树的一些基本算法。有层次建立,先根建立,中根建立,后根建立,先序和中序建立,后序和中序建立;先根遍历,中根遍历,后根遍历,层次遍历,非递归的先根遍历,非递归根预入栈处理的先根遍历1,非递归根预入栈处理的先根遍历2,非递归的中根遍历,非递归的后根遍历,求叶子数,求节点数,求二叉树中度为1的节点总数,求二叉树中度为2的节点总数,求二叉树的高度等等。
  但是我写到用层次遍历输出二叉树时候,出现了问题。编译时没问题,但运行时,用层次遍历输出,输出结果不对。搞了很久,没搞出来,毕竟水平有限(现在大二)。现在很纠结,不搞出来,晚上睡觉都不爽。现在这时候,也问不到老师了,星期六嘛。
  所以发个帖,希望大家帮帮我,小弟在此先谢谢啦!

帖出程序的一部分,也就是出错的那一部分。

#include <iostream>
using namespace std;
const int maxsize=100;
typedef char datatype;
typedef struct node *pointer;
struct node 
{
datatype data;
pointer lchild,rchild;
};
typedef pointer bitree;

typedef struct
{
datatype data[maxsize+1];
int front,rear;
}sqqueue;

//////////////////////////////////////////////////
bitree PreCreat() //先根序列建立二叉树
{
bitree t;
char ch;
cin>>ch;
if(ch=='@') return NULL;
t=new node;
t->data=ch;
t->lchild=PreCreat();
t->rchild=PreCreat();
return t;
}

/////////////////////////////////////////////////////
void init_sqqueue(sqqueue &Q) //循环队列初始化
{
Q.front=Q.rear=0;
}

int empty_sqqueue(sqqueue &Q) //循环队列空判断
{
if(Q.rear==Q.front) return 1;
else return 0;
}

void en_sqqueue(sqqueue &Q,pointer p) //入队
{
if(((Q.rear+1)%maxsize)==Q.front)
{
cout<<"队满,不能入队!\n"<<endl;
}
else
{
Q.rear=(Q.rear+1)%maxsize;
Q.data[Q.rear]=p->data;
}

}

node *de_sqqueue(sqqueue &Q) //出队,返回原对头指针
{
pointer p;
if(Q.rear==Q.front)
{
cout<<"队空,不能出队\n";
return NULL;
}
else
{
Q.front=(Q.front+1)%maxsize;
p->data=Q.data[Q.front];
return p;
}
}

void Levelorder(bitree t) //层次遍历
{
pointer p;
sqqueue Q; //循环队列
if(NULL==t) return;
init_sqqueue(Q);
en_sqqueue(Q,t); //根结点入队
while(!empty_sqqueue(Q)) //队列非空
{
cout<<de_sqqueue(Q)->data;
if(p->lchild!=NULL) en_sqqueue(Q,p->lchild);
if(p->rchild!=NULL) en_sqqueue(Q,p->rchild); 
}
}
/////////////////////////////////////////////////////

int main()
{
bitree t;
cout<<"按先根序列建立二叉树,用@表示虚结点,"<<endl;
t=PreCreat();
Levelorder(t);
cout<<endl;
return 0;
}

[解决办法]
要学会提问,首先格式化一下代码,给出测试用例。
帮你改了一下:队列中应该存储二叉树结点指针。

C/C++ code
#include <iostream>using namespace std;const int maxsize=100;typedef char datatype;typedef struct node *pointer;struct node  {    datatype data;    pointer lchild,rchild;};typedef pointer bitree;typedef struct{    pointer data[maxsize+1];    int front,rear;}sqqueue;//////////////////////////////////////////////////bitree PreCreat() //先根序列建立二叉树{    bitree t;    char ch;    cin>>ch;    if(ch=='@') return NULL;    t=new node;    t->data=ch;    t->lchild=PreCreat();    t->rchild=PreCreat();    return t;}/////////////////////////////////////////////////////void init_sqqueue(sqqueue &Q) //循环队列初始化{        Q.front=Q.rear=0;}int empty_sqqueue(sqqueue &Q) //循环队列空判断{        if(Q.rear==Q.front) return 1;    else return 0;}void en_sqqueue(sqqueue &Q,pointer p) //入队{        if(((Q.rear+1)%maxsize)==Q.front)    {        cout<<"队满,不能入队!\n"<<endl;    }    else    {        // 顺序反了!        Q.data[Q.rear]=p;        Q.rear=(Q.rear+1)%maxsize;    }}node *de_sqqueue(sqqueue &Q) //出队,返回原对头指针{        pointer p;    if(Q.rear==Q.front)    {        cout<<"队空,不能出队\n";        return NULL;    }    else    {        p=Q.data[Q.front];        Q.front=(Q.front+1)%maxsize;            return p;    }}void Levelorder(bitree t) //层次遍历{    pointer p;    sqqueue Q; //循环队列    if(NULL==t) return;    init_sqqueue(Q);    en_sqqueue(Q,t); //根结点入队    while(!empty_sqqueue(Q)) //队列非空    {        p = de_sqqueue(Q);        cout << p->data << endl;        if(p->lchild!=NULL) en_sqqueue(Q,p->lchild);        if(p->rchild!=NULL) en_sqqueue(Q,p->rchild);      }}/////////////////////////////////////////////////////// abd@@@c@@int main(){    bitree t;    cout<<"按先根序列建立二叉树,用@表示虚结点,"<<endl;    t=PreCreat();    Levelorder(t);    cout<<endl;    system("PAUSE");    return 0;}/*按先根序列建立二叉树,用@表示虚结点,abd@@@c@@abcd*/ 

热点排行