#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR -1
typedef int Status;
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct TNode *lchild,*rchild;
}BiTNode,*BiTree;
//先函数声明
Status CreateBiTree(BiTree &T);//创建
Status PreRootTraverse(BiTree T);//先根遍历
Status InRootTraverse(BiTree T);//中根遍历
Status PostRootTraverse(BiTree T);//后根遍历
Status CopyTree(BiTree T1,BiTree T2);//复制
Status CompareTree(BiTree T,BiTree T2);//比较
Status CountTree(BiTree T,int num);//求叶子结点个数
Status BiTreeDepth(BiTree T);//求深度
Status TreeSearch(BiTree &T,char x);//查找x
//主函数
int main(){
int s;
TElemType x;
BiTree T=NULL;
BiTree T2=NULL;
int num=0;
//先建立一个菜单
while(1)
{
printf("-----------菜单------------------");
printf("1.建立一棵二叉树\n");
printf("2.复制二叉树\n");
printf("3.判断两棵二叉树相等\n");
printf("4.求二叉树的叶子结点个数\n");
printf("5.求二叉树的深度\n");
printf("6.查找二叉树中元素x\n");
printf("7.退出");
printf("---------------------------------");
printf("请选择以上方式:");
scanf("%d",&s);
switch(s)
{
case 1:
printf("输入二叉树中的元素(#代表空值)");
getchar();
CreateBiTree(T);
printf("先根遍历:");
PreRootTraverse(T);
printf("中根遍历:");
InRootTraverse(T);
printf("后根遍历:");
PostRootTraverse(T);
printf("\n");
break;
case 2:
CopyTree(T,T2);
printf("复制出的二叉树的后根遍历为:");
PostRootTraverse(T);
printf("\n");
break;
case 3:
if(CompareTree(T,T2)){
printf("这两棵树是相等的,复制操作成功");
}else{
printf("这两棵树是不相等的,复制操作不成功");
}
printf("\n");
break;
case 4:
printf("二叉树的叶子结点为:");
CountTree(T,num);
printf("\n");
break;
case 5:
printf("该二叉树的深度为:");
BiTreeDepth(T);
printf("\n");
break;
case 6:
printf("请输入要查的元素x:");
getchar();
scanf("%c",&x);
if(TreeSearch(T,x)){
printf("查找成功");
}else{
printf("该二叉树中没有该元素:");
}
break;
case 7:
printf("退出成功");
return 0;
default:
printf("ERROR");
}
printf("\n");
}
return 0;
}
//之后其他函数
Status CreateBiTree(BiTree &T)//创建
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')
T=NULL;
else
{
if(!(T=(BiTree)malloc(sizeof(BiTNode))))
return ERROR;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
Status PreRootTraverse(BiTree T)//先根遍历
{
if(T)
{
printf("%c",T->data);
PreRootTraverse(T->lchild);
PreRootTraverse(T->rchild);
}
return OK;
}
Status InRootTraverse(BiTree T)//中根遍历
{
if(T)
{
PreRootTraverse(T->lchild);
printf("%c",T->data);
PreRootTraverse(T->rchild);
}
return OK;
}
Status PostRootTraverse(BiTree T)//后根遍历
{
if(T)
{
PreRootTraverse(T->lchild);
PreRootTraverse(T->rchild);
printf("%c",T->data);
}
return OK;
}
Status CopyTree(BiTree T1,BiTree T2)//复制
{
if(T1)
{
T2=(BiTree)malloc(sizeof)(sizeof(BiTNode));
if(!T2)
{
return ERROR;
}
T2->data=T1->data;
CopyTree(T1->lchild,T2->lchild);
CopyTree(T1->rchild,T2->rchild);
}
else
T2=NULL;
return OK;
}
Status CompareTree(BiTree T,BiTree T2)//比较
{
if(!T&&!T2)||(!T->rchild)
return OK;
if(T&&T2)
{
if(T->data==T2->data)
{
if(CompareTree(T->lchild,T2->lchild))
if(CompareTree(T->rchild,T2->rchild))
{
return OK;
}
}
}
return OK;
}
Status CountTree(BiTree T,int num)//求叶子结点个数
{
if(!T->lchild)&&(!T->rchild)
{
num++;
}
CountTree(T->lchild,num);
CountTree(T->rchild,num);
return num;
}
Status BiTreeDepth(BiTree T)//求深度
{
int depthLeft,depthRight,depthval;
if(T!=NULL)
{
depthLeft=Depth(T->lchild);
depthLeft=Depth(T->rchild);
depthval=depthLeft>depthRight?depthLeft:depthRight+1;
}
else
{
depthval=0;
}
return depthval;
}
Status TreeSearch(BiTree &T,char x)//查找x
{
if(T)
if(T->data==x)
return OK;
else
if(TreeSearch(T->lchild,x)!=ERROR?TreeSearch(T->lchild,x):TreeSearch(T->lchild,x))
return OK;
return 0;
}
C语言实现二叉树的建立,我的程序为什么运行不了
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- CSDN专家-link 2021-11-17 19:50关注
运行不了是编译错误、程序崩溃、还是结果错误?
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 如何使用SC92F8003固件库解析私有协议数据?
- ¥15 如何在音频中嵌入字符串(水印)信息进行传递
- ¥30 plc怎么以设计说明书申请软著
- ¥15 硬盘识别不了,需要初始化,可我的数据怎么办
- ¥15 lvm2被mask了,怎么unmask都没用(标签-ubuntu|关键词-apt)
- ¥15 交叉注意力机制的残差问题
- ¥15 微信小程序:渲染收货地址时页面不显示
- ¥20 win7 64位DirectShow提示初始化失败如何解决?
- ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
- ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出