二叉树传参版

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值