#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
///此题我多加了一个插入的功能
typedef struct BiTreenode///二叉树结构体的成员信息
{
char data;///数据
struct BiTreenode *lchild,*rchild;///左右孩子
}BiTree;
void Create_BinaryTree(BiTree **);///创建二叉树
void PrePrint_BinaryTree(BiTree *);///先序遍历
void MidPrint_BinaryTree(BiTree *);///中序遍历
void AfterPrint_BinaryTree(BiTree *);///后序遍历
int Find_BinaryTree(BiTree *,char );///查找结点
int insert_BinaryTree(BiTree **,char ,char ,char );///插入结点
void clear();///清屏
int main()
{
BiTree *Tree;
int choose;///菜单选择
char e,ch1,ch2,flag;
do{///页面设计
printf("\t\t\t**********************\n");
printf("\t\t\t*1.二叉树的遍历与创建*\n");
printf("\t\t\t*2.先序遍历序列输出 *\n");
printf("\t\t\t*3.中序遍历序列输出 *\n");
printf("\t\t\t*4.后序遍历序列输出 *\n");
printf("\t\t\t*5.查找结点 *\n");
printf("\t\t\t*6.插入结点 *\n");
printf("\t\t\t*0.退出 *\n");
printf("\t\t\t**********************\n");
printf("请输入你需要操作的菜单:");
scanf("%d",&choose);
if(choose==0)
{
printf("\t\t\t欢迎下次再使用!\n");
break;
}
switch(choose)
{
case 1:getchar();printf("请输入一段串字符进行创建二叉树:");Create_BinaryTree(&Tree);break;///为什么加getchar,是因为我接下来输入的是%c,回车键相当于一个字符读入,影响到结果
case 2:printf("先序遍历序列:");PrePrint_BinaryTree(Tree);puts("");break;
case 3:printf("中序遍历序列:");MidPrint_BinaryTree(Tree);puts("");break;
case 4:printf("后序遍历序列:");AfterPrint_BinaryTree(Tree);puts("");break;
case 5:getchar();printf("请输入你需要查找的结点:");scanf("%c",&e);///加getchar也是因为%c的问题
if(Find_BinaryTree(Tree,e))///真就是输出YES
puts("YES");
else///否则输出NO
puts("NO");
break;
case 6:getchar();
printf("请输入ch1 ch2 flag:");
scanf("%c %c %c",&ch1,&ch2,&flag);
if(!insert_BinaryTree(&Tree,ch1,ch2,flag))
printf("no found\n");///如果插入的结点二叉树里没有就提示用户没有该结点
break;
default:printf("输入错误,请重新输入\n");break;
}
clear();///操作完进行清屏
}while(1);
return 0;
}
///创建二叉树
void Create_BinaryTree(BiTree **Tree)///因为二叉树是指针类型,这里得用二级指针来传递,才能修改二叉树的内容
{
char data;
scanf("%c",&data);
if(data=='0')///输入代表该结点是空的
*Tree=NULL;///就让它指向空的
else
{
*Tree=(BiTree *)malloc(sizeof(BiTree));///申请空间
(*Tree)->data=data;///赋值
Create_BinaryTree(&((*Tree)->lchild));///递归,紧接着开创它的左孩子
Create_BinaryTree(&((*Tree)->rchild));///递归,紧接这开创它的右孩子
}
}
///先序遍历
void PrePrint_BinaryTree(BiTree *Tree)
{
if(Tree==NULL)///空的就说明递归到底了
return ;///进行返回,不再进行接下来的操作
printf("%c",Tree->data);///先序遍历就是根先输出
PrePrint_BinaryTree(Tree->lchild);///然后它的左孩子,递归之后就输出它的左孩子的左孩子,一直到底
PrePrint_BinaryTree(Tree->rchild);///再然后就是它的右孩子,类似
}
///中序遍历
void MidPrint_BinaryTree(BiTree *Tree)
{
if(Tree==NULL)///空的就说明递归到底了
return ;///进行返回,不再进行接下来的操作
MidPrint_BinaryTree(Tree->lchild);///中序遍历是先输出它的左孩子
printf("%c",Tree->data);///然后才是根的输出
MidPrint_BinaryTree(Tree->rchild);///再然后就是它的右孩子的输出
}
///后序遍历
void AfterPrint_BinaryTree(BiTree *Tree)
{
if(Tree==NULL)///空的就说明递归到底了
return ;///进行返回,不再进行接下来的操作
AfterPrint_BinaryTree(Tree->lchild);///后序遍历是先输出它的左孩子
AfterPrint_BinaryTree(Tree->rchild);///再然后就是输出它的右孩子
printf("%c",Tree->data);///到最后才输出它的根
}
int Find_BinaryTree(BiTree *Tree,char e)///查找
{
if(Tree==NULL)///进入该查找要先判断它的根是不是空的,是空的就直接返回,说明查找不到
return 0;
if(Tree->data==e)///如果根不是空的,就判断它是不是我们需要查找的结点,是的话就返回1
return 1;
if(Find_BinaryTree(Tree->lchild,e)||Find_BinaryTree(Tree->rchild,e))///这个是递归的思想,从它的左孩子或者右孩子去找,谁先找到就返回1
return 1;///在某一层查找到,就返回上一层告诉它找到了,一直传递,直到传递到第一层,也就是说明查找到
else
return 0;///如果告诉第一层的是0,也就是查找失败,不存在该结点
}
///插入结点
int insert_BinaryTree(BiTree **Tree,char ch1,char ch2,char flag)
{
///插入首先得先进行查找,查找到才可以进行插入
BiTree *t;
if(*Tree==NULL)///如果根是空的就直接返回0,告诉用户查找失败,也就没法插入
return 0;
else if((*Tree)->data==ch1)///再去判断它的根是不是要插入的结点,如果是的话就进行插入操作
{
if(flag=='L')///这个是标记是要插入在这个结点的左边
{
t=(BiTree *)malloc(sizeof(BiTree));///要插入说明就得申请一个空间
t->data=ch2;///ch2是要插入的字符
t->lchild=(*Tree)->lchild;///插入结点的左右孩子必须把它要插入的结点给衔接过去
t->rchild=(*Tree)->rchild;
(*Tree)->lchild=t;///查到到的结点要指向插入结点
(*Tree)->rchild=NULL;///要插入这个结点的左孩子,那它的右孩子肯定是空的
}
else if(flag=='R')///这个是标记是要插入在这个结点的右边
{
t=(BiTree *)malloc(sizeof(BiTree));///要插入说明就得申请一个空间
t->data=ch2;///ch2是要插入的字符
t->lchild=(*Tree)->lchild;///插入结点的左右孩子必须把它要插入的结点给衔接过去
t->rchild=(*Tree)->rchild;
(*Tree)->rchild=t;///查到到的结点要指向插入结点
(*Tree)->lchild=NULL;///要插入这个结点的右孩子,那它的左孩子肯定是空的
}
return 1;///插入成功就返回1,代表结束操作了
}
if(insert_BinaryTree(&((*Tree)->lchild),ch1,ch2,flag))///如果没有查找到,就查找左孩子,有的话就进行插入操作,也是递归
return 1;
if(insert_BinaryTree(&((*Tree)->rchild),ch1,ch2,flag))///如果没有查找到,就查找右孩子,有的话就进行插入操作,也是递归
return 1;
return 0;///如果都查找不到,也就没法进行插入操作,返回0
}
///清屏
void clear()
{
printf("请按任意键继续......");
getch();
system("cls");
}
二叉树传参版
最新推荐文章于 2023-04-18 18:50:07 发布