二叉树问题,求帮助......多谢!
今天写了一个二叉树的一些基本算法。有层次建立,先根建立,中根建立,后根建立,先序和中序建立,后序和中序建立;先根遍历,中根遍历,后根遍历,层次遍历,非递归的先根遍历,非递归根预入栈处理的先根遍历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;
}
[解决办法]
要学会提问,首先格式化一下代码,给出测试用例。
帮你改了一下:队列中应该存储二叉树结点指针。
#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*/