实验四二叉树

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
/*二叉树的二叉链表存储结构*/
typedef char dataType;
typedef struct node
{
    dataType data;
    struct node *lchild, *rchild; /**左右孩子指针**/
}*BinTree,BinNode; /**结点类型**/
typedef BinTree QelemType;
typedef struct
{
    QelemType num[MaxSize];
    int front;
    int rear;
} Queue;
Queue Q;
void initilize()   ///初始化队列
{
    Q.front=0;
    Q.rear=0;
}
int Push(BinNode *T)   ///入队
{
    if((Q.rear+1)==Q.front)
        return 0;
    else
        Q.num[++Q.rear] = T;
    return 1;
}

BinNode *Pop()   ///出队
{
    if(Q.front==Q.rear)
        return 0;
    return Q.num[++Q.front];
}

int Empty()   ///判断对列是否为空
{
    if(Q.front==Q.rear)
        return 1;
    else
        return 0;
}
///建立二叉树
int CreateBinTree(BinTree *T)
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#'){
        *T=NULL;
    }
    else
    {
        *T=(BinTree)malloc(sizeof(BinNode)); 
        if(!(*T)){
            return 0;
        }
        (*T)->data = ch;
        CreateBinTree(&(*T)->lchild);
        CreateBinTree(&(*T)->rchild);
    }
    return 1;
}
///中序遍历
void inOder(BinTree T)
{
    if(!T)
        return ;
    if(T)
    {
        inOder(T->lchild);
        printf("%c ", T->data);
        inOder(T->rchild);
    }
}
///先序遍历
void PreOder(BinTree T)
{
    if(!T)
        return ;
    if(T)
    {
        printf("%c ", T->data);
        PreOder(T->lchild);
        PreOder(T->rchild);
    }
}
///后序遍历
void PostOder(BinTree T)
{
    if(!T)
        return ;
    if(T)
    {
        PostOder(T->lchild);
        PostOder(T->rchild);
        printf("%c ", T->data);
    }
}
///二叉树的层次遍历
void LevelOrder(BinTree T)
{
    BinNode *temp;
    if(!T)
        return;
    Push(T);
    while (!Empty())
    {
        temp = Pop();
        printf("%c ", temp->data);  ///输出队首结点
        if(temp->lchild)     ///把Pop掉的结点的左子结点加入队列
            Push(temp->lchild);
        if(temp->rchild)    ///把Pop掉的结点的右子结点加入队列
            Push(temp->rchild);
    }
}
///二叉树的深度
int Depth(BinTree T)
{
    int hl, hr;
    if(!T)
        return 0;
    else
    {
        hl=Depth(T->lchild);
        hr=Depth(T->rchild);
        if(hl>=hr)
            return hl+1;
        else
            return hr+1;
    }
}
//二叉树中叶子结点的个数
int LeafCount(BinTree T)
{
    if(!T)
        return 0;
    if(!T->lchild&&!T->rchild)//加1.
    {
        return 1;
    }
    else
    {
        return LeafCount(T->lchild)+LeafCount(T->rchild);
    }
}
///交换左右子树
int exchange(BinTree T)
{
    BinNode *temp;
    if(!T)
        return 0;
    if(T->lchild==NULL&&T->rchild==NULL)
        return 0;
    else
    {
        temp=T->lchild;
        T->lchild=T->rchild;
        T->rchild=temp;
    }
    if(T->lchild)
        exchange(T->lchild);
    if(T->rchild)
        exchange(T->rchild);
    return 1;
} 
void menu()
{
    printf("--------------------二叉树的建立与应用-------------------------\n");
    printf("\t1.二叉树的中序遍历\n");
    printf("\t2.二叉树的前序遍历\n");
    printf("\t3.二叉树的后序遍历\n");
    printf("\t4.二叉树的层次遍历\n");
    printf("\t5.二叉树的深度\n");
    printf("\t6.二叉树叶子结点的个数\n");
    printf("\t7.二叉树每个结点的左右子树交换位置\n");
    printf("\t8.退出系统\n");
    printf("----------------------------------------------------------------\n");
}
int main()
{
    BinTree T;
    int m,leafsize=0;
    menu();
    printf("按先序序列创建一个二叉树:\n");
    if(CreateBinTree(&T)==1)
        printf("创建成功!\n");
    while(1)
    {
        printf("请输入序号,实现菜单功能\n");
        scanf("%d", &m);
        if(m==1)
        {
            printf("中序遍历为:\n");
            inOder(T);
            printf("\n");
        }
        else if(m==2)
        {
            printf("先序遍历为:\n");
            PreOder(T);
            printf("\n");
        }
        else if(m==3)
        {
            printf("后序遍历为:\n");
            PostOder(T);
            printf("\n");
        }
        else if(m==4)
        {
            printf("层次遍历为:\n");
            initilize();
            LevelOrder(T);
            printf("\n");
        }
        else if(m==5)
        {
            printf("二叉树深度为:\n");
            printf("%d\n", Depth(T));
        }
        else if(m==6)
        {
            leafsize=LeafCount(T);
            printf("二叉树叶子结点数为:\n");
            printf("%d\n",leafsize);
        }
        else if(m==7)
        {
            printf("左右子树进行交换:\n");
            if(exchange(T)==1)
                printf("交换完成!\n");
            printf("交换后中序遍历为:\n");
            inOder(T);
            printf("\n");
            printf("交换后先序遍历为:\n");
            PreOder(T);
            printf("\n");
            printf("交换后后序遍历为:\n");
            PostOder(T);
            printf("\n");
            printf("交换后层次遍历为:\n");
            initilize();
            LevelOrder(T);
            printf("\n");
        }
        else if(m==8)
        {
            printf("退出菜单\n");
            break;
        }
    }
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值