二叉树的建立与基本操作

编写程序实现二叉树的如下操作:
1) 建立二叉链表
2) 二叉树的先序、中序、后序遍历
3) 求二叉树的叶子结点个数
4) 将二叉树中所有结点的左、右子树相互交换

输入:
  按完全二叉树的层次关系给出二叉树的遍历序列(#表示虚结点,数据结点为单一字符)。

输出:
  二叉树的凹入表示
  二叉树的先序序列、中序序列、后序序列
  二叉树叶子结点个数
  左、右子树相互交换后的二叉树的凹入表示
  左、右子树相互交换后的二叉树的先序序列、中序序列、后序序列。

说明:
  在输出凹入表示的二叉树时,先输出根结点,然后依次输出左右子树,上下层结点之间相隔 3 个空格。

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. abc#de↵
以文本方式显示
  1. BiTree↵
  2. a↵
  3.     b↵
  4.         d↵
  5.     c↵
  6.         e↵
  7. pre_sequence  : abdce↵
  8. in_sequence   : bdaec↵
  9. post_sequence : dbeca↵
  10. Number of leaf: 2↵
  11. BiTree swapped↵
  12. a↵
  13.     c↵
  14.         e↵
  15.     b↵
  16.         d↵
  17. pre_sequence  : acebd↵
  18. in_sequence   : ceadb↵
  19. post_sequence : ecdba↵
1秒64M0
测试用例 2以文本方式显示
  1. abcdefg↵
以文本方式显示
  1. BiTree↵
  2. a↵
  3.     b↵
  4.         d↵
  5.         e↵
  6.     c↵
  7.         f↵
  8.         g↵
  9. pre_sequence  : abdecfg↵
  10. in_sequence   : dbeafcg↵
  11. post_sequence : debfgca↵
  12. Number of leaf: 4↵
  13. BiTree swapped↵
  14. a↵
  15.     c↵
  16.         g↵
  17.         f↵
  18.     b↵
  19.         e↵
  20.         d↵
  21. pre_sequence  : acgfbed↵
  22. in_sequence   : gcfaebd↵
  23. post_sequence : gfcedba↵
1秒64M0

 

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<math.h>  
  
typedef struct BiTree  
{  
    char d;  
    struct BiTree* r;  
    struct BiTree* l;  
}BT;  
  
int leafnum;  
  
BT* creatnode(char d)  
{  
    BT* p=NULL;  
    p=(BT*)malloc(sizeof(BT));  
    p->d=d;  
    p->l=NULL;  
    p->r=NULL;  
    return p;  
}  
  
char t[200]; //二叉树   
int level=0,depth=0; //level为当前输入二叉树的层数,depth为每次递归进入的层数   
  
int creatBiTree(BT* root,int sum)  
{  
    double q=(double)sum;  
    depth=ceil(log(q)/log(2));  
    if(depth>level)   
    {  
        depth--;  
        return 0;  
    }  
    char ltemp,rtemp;  
    //left  
    ltemp=t[2*sum-1];  
    rtemp=t[2*sum];  
  
    if(ltemp=='#'||ltemp=='\0')  
        root->l=NULL;  
    else  
    {  
        root->l=creatnode(ltemp);  
        creatBiTree(root->l,2*sum);  
    }  
    //right    
    if(rtemp=='#'||rtemp=='\0')  
    root->r=NULL;  
    else  
    {  
        root->r=creatnode(rtemp);  
        creatBiTree(root->r,2*sum+1);  
    }  
    return 0;  
  
}  
  
int printtree(BT* root,int rank)  
{  
    if(root==NULL)  
        return 0;  
    for(int i=0;i<rank;i++)  
        printf("    ");  
    printf("%c\n",root->d);  
    printtree(root->l,rank+1);  
    printtree(root->r,rank+1);  
    return 0;  
}  
  
int printperorder(BT* head)  
{  
    if(head==NULL)  
        return 0;  
    printf("%c",head->d);  
    printperorder(head->l);  
    printperorder(head->r);  
    return 0;  
}  
  
int printinorder(BT* head)  
{  
    if(head==NULL)  
        return 0;  
    printinorder(head->l);  
    printf("%c",head->d);  
    printinorder(head->r);  
    return 0;  
}  
  
int printpostorder(BT* head)  
{  
    if(head==NULL)  return 0;  
    printpostorder(head->l);  
    printpostorder(head->r);  
    printf("%c",head->d);  
    return 0;  
}  
  
int countleaf(BT* head)  
{  
    if(head->l==NULL&&head->r==NULL)  
        leafnum++;  
    if((head->l))  
        countleaf(head->l);  
    if((head->r))  
        countleaf(head->r);  
    return 0;  
}  
  
BT* swap(BT* head)  
{  
    BT* p=NULL;  
    if(head==NULL)  return NULL;  
    p=head->l;  
    head->l=head->r;  
    head->r=p;  
    swap(head->r);  
    swap(head->l);  
    return NULL;  
}  
  
int main()  
{  
    int lt,length;  
    BT* head=NULL;  
  
    memset(t,'\0',sizeof(t));  
    scanf("%s",&t);  
    head=creatnode(t[0]);  
    lt=strlen(t);  
    length=(double)lt;  
    level=ceil(log(length)/log(2));  
    //printf("%d\n",level);  
    creatBiTree(head,1);   //creat the tree   
  
    printf("BiTree\n");  
    printtree(head,0);  
  
    printf("pre_sequence  : ");  
    printperorder(head);  
    printf("\n");  
    printf("in_sequence   : ");  
    printinorder(head);  
    printf("\n");  
    printf("post_sequence : ");  
    printpostorder(head);  
    printf("\n");  
  
    leafnum=0;  
    countleaf(head);  
    printf("Number of leaf: %d\n",leafnum);  
    BT* heads=NULL;  
    heads=swap(head);  
    heads=head;  
    printf("BiTree swapped\n");  
    printtree(heads,0);  
    printf("pre_sequence  : ");  
    printperorder(heads );  
    printf("\n");  
    printf("in_sequence   : ");  
    printinorder(heads);  
    printf("\n");  
    printf("post_sequence : ");  
    printpostorder(heads);  
    printf("\n");  
    return 0;  
}  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值