给你完全调好了,一切正常运行:
#include "stdio.h"
#include "stdlib.h"
typedef int status; //C中没有status类型,所以想使用这个类型你必须定义它
#define OK 0
#define ERROR -1
#define OVERFLOW -2 //OK、OVERLFLOW、ERROR这些宏的定义头文件中是没有的,所以你必须自己定义它们
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct QNode{
BiTNode *data;
struct QNode *next; //马虎。少个字符Q
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void CreateBiTree(BiTree &T)
{
char ch;
/*printf("Input the char\n"); //你把输出语句放到递归的函数里它会输出N多遍,所以,还是放到主函数里吧 */
scanf("%c",&ch); //你忘了取地址符了
/*if(ch == '#')T==NULL;*/ if(ch == '#')T=NULL;//是将T指针赋值为空,而不是T==NULL;
else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(OVERFLOW);
/**T.data=ch;*/T->data=ch; //楼主要仔细研究一下指向运算符"->"和结构体成员运算符"."的区别,此程序中N多错误都是因为没有区分它们引起的
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
status DLR(BiTree root) //void类型是不能返回值的,所以你可以把函数改成status类型;函数参数不用引用。因为没有改变参数值,只是使用
{
if(root!=NULL)
{
printf("%c",root->data);
DLR(root->lchild);
DLR(root->rchild); //这一点属于严重错误,说明你没有弄清递归遍历的过程。是先根,再左,再右。下面还有三个同样的错误
}
return OK;
}
status LDR(BiTree root) //函数参数不用引用。因为没有改变参数值,只是使用
{
if(root!=NULL)
{
LDR(root->lchild);
printf("%c",root->data);
LDR(root->rchild); //同上
}
return OK;
}
status LRD(BiTree root) //函数参数不用引用。因为没有改变参数值,只是使用
{
if(root!=NULL)
{
LRD(root->lchild);
LRD(root->rchild); //同上
printf("%c",root->data);
}
return OK;
}
int i=0;
int Found_SUM(BiTree root)
{
if(root!=NULL)
{
i++;
Found_SUM(root->lchild);
Found_SUM(root->rchild);//递归求结点数,和遍历函数有什么关系?
}
return i;
}
int j=0;
int FOUND_LEAVES(BiTree root)
{
if(root!=NULL)
{
if(!root->lchild&&!root->rchild)j++;
FOUND_LEAVES(root->lchild);
FOUND_LEAVES(root->rchild);
}
return j;
}
status InitQueue(LinkQueue &Q) //这儿应该是初始化队列,而不是销毁队列吧。。。汗。。。你原来的步骤是用来销毁队列Q的啊
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
status EnQueue(LinkQueue &Q,BiTree e)
{
QueuePtr p=NULL;//p的定义。。
p=(QueuePtr)malloc(sizeof(QNode));//马虎,少个右括号
if(!p) exit(OVERFLOW);
p->data=e;p->next=NULL;//马虎,两个语句要用";"分开
Q.rear->next=p;
Q.rear=p;
return OK;
}
status DeQueue(LinkQueue &Q,BiTree &e) //此处添加一个引用参数e较为方便,你原来的方法太复杂了
{
QueuePtr p;
if(Q.front==Q.rear)return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return OK;
}
status LSCAN(BiTree root)
{
LinkQueue Q;
BiTree e=NULL;
InitQueue(Q);
EnQueue(Q,root);
while(Q.front
DeQueue(Q,root);
printf("%c",root->data);
if(root->lchild)EnQueue(Q,root->lchild);
if(root->rchild)EnQueue(Q,root->rchild);
}
return OK;
}
void main()
{
BiTree T=NULL;//未定义T
T=(BiTree)malloc(sizeof(BiTNode));
int a,b;
printf("Input the char\n");
CreateBiTree(T);
printf("\n");
printf("先序遍历二叉树:\n");
DLR(T);
printf("\n");
printf("中序遍历二叉树:\n");
LDR(T);
printf("\n");
printf("后序遍历二叉树:\n");
LRD(T);
printf("\n");
printf("层序遍历二叉树:\n");
LSCAN(T);
/*LSCAN(T); // 不知你为啥要用两遍这个函数,给你注释掉了一个*/
a=Found_SUM(T);
b=FOUND_LEAVES(T);
printf("叶子结点数目%d",b);printf("\n");
printf("结点总数%d",a);
printf("\n");
}
哥们,错是改完了,可以正常执行。但是里面的功能不知道能不能实现,就看你原先的思路对不对,如果你能保证正确,那就应该可以实现正常功能了。
#include "stdio.h"
#include "stdlib.h"
typedef int status;
#define OK 1
#define OVERFLOW 0
#define ERROR -1
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct QNode{
BiTNode *data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void CreateBiTree(BiTree T)
{
T=new BiTNode;
char ch;
printf("Input the char\n");
scanf("%c",&ch);
if(ch == '#')T=NULL;
else{
T->data=ch;
fflush(stdin);
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
status DLR(BiTree root)
{
if(root!=NULL)
{
printf("%c",root->data);
DLR(root->lchild);
DLR(root->lchild);
}
return OK;
}
status LDR(BiTree root)
{
if(root!=NULL)
{
LDR(root->lchild);
printf("%c",root->data);
LDR(root->lchild);
}
return OK;
}
status LRD(BiTree root)
{
if(root!=NULL)
{
LRD(root->lchild);
LRD(root->lchild);
printf("%c",root->data);
}
return OK;
}
int i=0;
int FOUND_SUM(BiTree root)
{
if(root!=NULL)
{
i++;
DLR(root->lchild);
DLR(root->lchild);
}
return i;
}
int j=0;
int FOUND_LEAVES(BiTree root)
{
if(root!=NULL)
{
if(!root->lchild&&!root->rchild)j++;
DLR(root->lchild);
DLR(root->lchild);
}
return j;
}
status InitQueue(LinkQueue Q)
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return OK;
}
status EnQueue(LinkQueue Q,BiTNode e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit (OVERFLOW);
p->data=&e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
BiTNode DeQueue(LinkQueue Q)
{
BiTNode *e;
QNode *p;
if(Q.front==Q.rear)
return *e;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return *e;
}
status LSCAN(BiTree root)
{
LinkQueue Q;
BiTNode p;
InitQueue(Q);
EnQueue(Q,*root);
while(Q.front);
{
p=DeQueue(Q);
printf("%c",p.data);
if(!p.lchild)EnQueue(Q,*p.lchild);
if(!p.rchild)EnQueue(Q,*p.rchild);
}
return OK;
}
void main()
{
BiTree T;
int a,b;
CreateBiTree(T);
printf("\n");
DLR(T);
printf("\n");
LDR(T);
printf("\n");
LRD(T);
printf("\n");
LSCAN(T);
LSCAN(T);
a=FOUND_SUM(T);
b=FOUND_LEAVES(T);
printf("叶子节点数目%d",b);printf("\n");
printf("结点总数%d",a);
printf("\n");
}
全部完工了
大体思想是没问题的
就是有很多细节要注意,写程序的时候太粗心了
除了层次遍历 其他的都改好了 写了注释
假设一个树
1
2 3
4 5 6 7
应该这么输入 1(回车) 2(回车) 4(回车) #(回车) #(回车) 5(回车)
#(回车) #(回车) 3(回车) 6(回车) #(回车) #(回车) 7(回车) #(回车) #(回车)
#include
#include
typedef struct biTNode//这里的名字最好和后面的新类型名BiNTode不一样
{
char data;
struct biTNode *lchild,*rchild;
}BiTNode,*BiTree;
//你如果只是为了进行层次遍历,不需要定义那么多数据结构
typedef struct LiquNode{
BiTree data[10];
int rear,top;
}*Liqueue;
//这里你输入一个数回车一次
void CreateBiTree(BiTree &T)
{
char ch;
printf("Input the char:");
scanf("%c", &ch);//输入int 和char型的时候,要加&
getchar();//每次输入一个都有回车符号 ,要去掉他
if(ch == '#') T = NULL;//赋值用=
else
{
T = (BiTree)malloc(sizeof(BiTNode));//要为每个节点申请动态内存
T->data=ch; //这么写比较自然,你也可以(*T).data
//成员运算符的优先级别较低,所以加括号,或者直接我这样,后面都是如此
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void DLR(BiTree &root)
{
if(root!=NULL)
{
printf("%c ",root->data);
DLR(root->lchild);
DLR(root->rchild);//后面的都写错了,我改过来了
}
return;//void不需要返回值
}
void LDR(BiTree &root)
{
if(root!=NULL)
{
LDR(root->lchild);
printf("%c ",root->data);
LDR(root->rchild);
}
}
void LRD(BiTree &root)
{
if(root!=NULL)
{
LRD(root->lchild);
LRD(root->rchild);
printf("%c ",root->data);
}
return;
}
int i=0;
int FOUND_SUM(BiTree &root)
{
if(root!=NULL)
{
i++;
FOUND_SUM(root->lchild); //这里连函数名都写错了
FOUND_SUM(root->rchild);
}
return i;
}
int j=0;
int FOUND_LEAVES(BiTree &root)
{
if(root!=NULL)
{
if(!root->lchild&&!root->rchild)j++;
FOUND_LEAVES(root->lchild);
FOUND_LEAVES(root->rchild);
}
return j;
}
void LeverorderTree(BiTree T ,Liqueue liquque)
{
//assert(p!=NULL);
if(T->data != '#')
{
printf("%c ",T->data);
if(T->lchild != NULL)
{
liquque->rear++;
liquque->data[liquque->rear] = T->lchild;
}
if(T->rchild != NULL)
{
liquque->rear++;
liquque->data[liquque->rear] = T->rchild;
}
while(liquque->rear != liquque->top)
{
liquque->top++;
LeverorderTree(liquque->data[liquque->top],liquque);
}
}
}
/*
void InitQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return;
}
void EnQueue(LinkQueue &Q,BiTNode e)
{
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit (OVERFLOW);
p.data=e,p.next=NULL;
Q.rear->next=p;
Q.rear=p;
return;
}
BiTNode DeQueue(LinkQueue &Q)
{
BiTNode e
if(Q.front==Q.rear)return ERROR;
p=Q.front->next;
e=p.data;
Q.front->nest=p->next;
if(Q.rear ==p)Q.rear=Q.front;
free(p);
return *e;
}
status LSCAN(BiTree *root)
{
LinkQueue *Q
BiTNode p;
InitQueue(Q);
EnQueue(Q,root);
while(Q);
{
p=DeQueue(Q);
printf("%c",p.data);
if(!p.lchild)EnQueue(Q,p.lchild);
if(!p.rchild)EnQueue(Q,p.rchild);
}
}
*/
void main()
{
//它只是一个指针,不需要分配内存,到是树的每个节点要分配内存
BiTree T;
Liqueue p1 = (Liqueue)malloc(sizeof(LiquNode));
p1->rear = p1->top = -1;
int a,b;
CreateBiTree(T);
printf("\n");
printf("先序:");
DLR(T);
printf("\n");
printf("中序:");
LDR(T);
printf("\n");
printf("后序:");
LRD(T);
printf("\n");
printf("层次:");
LeverorderTree(T,p1);
printf("\n");
a=FOUND_SUM(T); //这里有拼写错误
b=FOUND_LEAVES(T);
printf("叶子结点数目%d",b);printf("\n");
printf("结点总数%d",a);
printf("\n");
}
兄弟,给加个注释吧