问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于数据结构C语言二叉树的程序,请人帮忙看看~谢谢

发布网友 发布时间:2023-05-26 22:33

我来回答

4个回答

热心网友 时间:2024-12-10 04:41

给你完全调好了,一切正常运行:
#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<Q.rear) //如果队列非空
{
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");
}

热心网友 时间:2024-12-10 04:42

哥们,错是改完了,可以正常执行。但是里面的功能不知道能不能实现,就看你原先的思路对不对,如果你能保证正确,那就应该可以实现正常功能了。

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

热心网友 时间:2024-12-10 04:42

全部完工了

大体思想是没问题的
就是有很多细节要注意,写程序的时候太粗心了
除了层次遍历 其他的都改好了 写了注释

假设一个树
1
2 3
4 5 6 7
应该这么输入 1(回车) 2(回车) 4(回车) #(回车) #(回车) 5(回车)
#(回车) #(回车) 3(回车) 6(回车) #(回车) #(回车) 7(回车) #(回车) #(回车)

#include <stdio.h>
#include <stdlib.h>

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");
}

热心网友 时间:2024-12-10 04:43

兄弟,给加个注释吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大庆读专业的地方有哪些,就是像哈尔滨哪里,全都是学技术,比如拉丁,爵士... 如何修改朋友圈标签内容 ...是否允许照相机访问,不小心点了【记住我的选择】+【拒绝】该怎么解除... 豆芽炒肉(豆芽炒肉的家常做法) 工程勘察设计资质代办步骤有哪些 工程设计专项资质变更代办流程和资料 工程设计资质代办步骤有哪些 设计院资质代办步骤有哪些 Excel也能增加“后悔”次数 excel如何修改增加撤销次数 快手获得内测资格是什么意思 爱滋病的抗原是不是就是指的是爱滋病这种病毒啊,抗原就是病毒,还是什么... UN, UNF, UNC的含义是什么? 驰图Q9运动相机参数 社区团购是什么? 网络上红色高跟鞋猜猜是什么东西 驰图cs80运动相机怎么样 佛山顺德江面飘来4吨走私冻肉遭哄抢,抢这些东西的都是些什么人? 为什么今年社区团购这么火? 一个红色高跟鞋猜图是什么 什么是新女性? 手机中的操作选项“发送副本”是什么意思? 厦门闪达物流有限公司怎么样? 酷家乐360全景可不可以只渲染270度 潮汕入宅五花是那五花 香港边间冒险乐园最大最好玩 ?!!! 酷家乐渲染相机高度多少合适 大人进波波池什么意思 timi是什么意思 解读timi的含义和用法? 酷家乐相机裁剪不见了 我先训了是什么意思 奔驰唯雅诺蓄电池电压低? 奔驰控制电路电压低是什么问题 奔驰车电瓶容量过低怎么办? 账本上的成本为负数是怎么回事 二阶导数不能套公式什么意思 精神疾病临床诊疗规范推广活动是啥活动? 小火锅电磁炉选购技巧 究竟小电磁炉多少钱一个 电磁炉报价是多少?电磁炉厂家有哪些? 三角电磁炉怎么样?三角电磁炉价格是多少? 《医冠天下》txt下载在线阅读全文,求百度网盘云资源 女主叫雪凰 男主叫东方临天 是什么小说 问道灵鹿多少钱收 问道鹿的价格,还有熊。 购买住宅和商办有什么区别? 问道御灵鹿的现价? 问道里面的坐骑怎样可以获得? 适合老年人的装修风格装修老年人住宅需要注意什么 求大神,酷派5892_C00怎么root?