二叉树

#include<bits/stdc++.h>
#define MAX 100
using namespace std;

int Count=0;
typedef struct tnode
{
    char data;
    struct tnode *lchild,*rchild;
}BT;

BT *CreateBTree()
{
    BT *t;
    char ch;
    scanf("%c",&ch);
    getchar();
    if(ch=='0')
        t=NULL;
    else
    {
        t=(BT *)malloc(sizeof(BT));
        t->data=ch;
        printf("请输入%c结点的左孩子结点:",t->data);
        t->lchild=CreateBTree();
        printf("请输入%c结点的右孩子结点:",t->data);
        t->rchild=CreateBTree();
    }
    return t;
}

void ShowBTree(BT *T)
{
    if(T!=NULL)
    {
        printf("%c",T->data);
        if(T->lchild!=NULL)
        {
            printf("(");
            ShowBTree(T->lchild);
            if(T->rchild!=NULL)
            {
                printf(",");
                ShowBTree(T->rchild);
            }
            printf(")");
        }
        else if(T->rchild!=NULL)
        {
          printf("(");
          ShowBTree(T->lchild);
          if(T->rchild!=NULL)
          {
              printf(",");
              ShowBTree(T->rchild);
          }
          printf(")");
        }
    }
}

//先序遍历
void PreOrder(BT *T)
{
   if(T==NULL)
        return;
   else
   {
       printf("%c",T->data);
       PreOrder(T->lchild);
       PreOrder(T->rchild);
   }
}
//中序遍历
void InOrder(BT *T)
{
    if(T==NULL)
        return;
    else
    {
        InOrder(T->lchild);
        printf("%c",T->data);
        InOrder(T->rchild);
    }
}
//后续遍历
void PostOrder(BT *T)
{
    if(T==NULL)
        return;
    else
    {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c",T->data);
    }
}
//层序遍历
LevelOrder(BT *T)
{
    int r,f;
    BT *p,*q[MAX];
    p=T;
    if(p!=NULL)
    {
        f=1,q[f]=p;r=2;
    }
    while(f!=r)
    {
        p=q[f];
        printf("%c",p->data);
        if(p->lchild!=NULL)
        {
            q[r]=p->lchild;
            r=(r+1)%MAX;
        }
        if(p->rchild!=NULL)
        {
            q[r]=p->rchild;
            r=(r+1)%MAX;
        }
        f=(f+1)%MAX;
    }
}
//求叶子结点数目
void Leafnum(BT *T)
{
    if(T)
    {
        if(T->lchild==NULL&&T->rchild==NULL)
            Count++;
            Leafnum(T->lchild);
            Leafnum(T->rchild);
    }
}
//求二叉树总结点数目
void Nodenum(BT *T)
{
    if(T)
    {
        Count++;
        Nodenum(T->lchild);
        Nodenum(T->rchild);
    }

}
//树的深度
int DepthBTree(BT *T)
{
    int ldep=0,rdep=0;
    if(T==0)
        return 0;
    else
    {
        ldep=DepthBTree(T->lchild);
        rdep=DepthBTree(T->rchild);
        if(ldep>=rdep)
            return ldep+1;
        else
            return rdep+1;
    }
}
void MenuTree()
{
    printf("\n=========================================");
    printf("\n|           1--建立一个新的二叉树       |");
    printf("\n|           2--广义表表示法表示         |");
    printf("\n|           3--先序遍历                 |");
    printf("\n|           4--中序遍历                 |");
    printf("\n|           5--后序遍历                 |");
    printf("\n|           6--层序遍历                 |");
    printf("\n|           7--求叶子结点数目           |");
    printf("\n|           8--求二叉树总结点数目       |");
    printf("\n|           9--树的深度                 |");
    printf("\n|           0--返回                     |");
    printf("\n=========================================");
    printf("\n请输入菜单号(0-9):");
}
int main()
{
    BT *T=NULL;
    char ch1,ch2,a;
    ch1='y';
    while(ch1=='y'||ch1=='Y')
    {
        MenuTree();
        scanf("%c",&ch2);
        getchar();
        switch(ch2)
        {
            case '0':
                ch1='n';
                break;

            case '1':
                printf("请按先序遍历输入二叉树结点\n");
                printf("说明:输入结点后按回车键('0'表示后继结点为空)\n");
                printf("请输入根结点:");
                T=CreateBTree();
                printf("二叉树成功建立!");
            break;

            case '2':
                printf("二叉树广义表示法如下:");
                ShowBTree(T);
            break;

            case '3':
                printf("二叉树的先序遍历序列为:");
                PreOrder(T);
            break;

            case '4':
                printf("二叉树的中序遍历序列为:");
                InOrder(T);
            break;

            case '5':
                printf("二叉树的后序遍历序列为:");
                PostOrder(T);
            break;

            case '6':
                printf("二叉树的层序遍历序列为:");
                LevelOrder(T);
            break;

            case '7':
                Count=0;
                Leafnum(T);
                printf("二叉树有%d个叶子",Count);
            break;

            case '8':
                Count=0;
                Nodenum(T);
                printf("该二叉树有%d个结点",Count);
                break;

            case '9':
                DepthBTree(T);
                printf("该树的深度为%d",DepthBTree(T));
                break;

            default:
                printf("输入有误,请在1-9进行选择");
        }

        if(ch2!='0')
        {
            printf("\n按回车键继续,按任意键返回主菜单!");
            a=getchar();
            if(a!='\xA')
            {
                getchar();
                ch1='n';
            }
        }
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值