浙大算法与数据结构 编程题 03-树2 List Leaves

主要思想先建树,然后利用队列进行层序遍历,在遍历过程中判断是否为叶子节点

#include<stdio.h>
#include <stdlib.h>
#define left 0//左节点
#define right 1//右节点
int main(){
    int n;
    char c[10][2];//数组建树
    int IfRoot[10]={0};//寻找根节点
    int root=-1;//初始化根位置
    
    scanf("%d\n",&n);
    for(int i=0;i<n;i++){
        scanf("%c %c\n",&c[i][left],&c[i][right]);
        if(c[i][left]>='0'||c[i][left]<='9')IfRoot[c[i][left]-'0']++;
        if(c[i][right]>='0'||c[i][right]<='9')IfRoot[c[i][right]-'0']++;
    }
    for(int i=0;i<n;i++)if(!IfRoot[i]){root=i;break;}//根节点位置录入至root

    // for(int i=0;i<n;i++)printf("%d ",IfRoot[i]);
    // printf("\n");
    // for(int i=0;i<n;i++){
    //     for(int j=0;j<2;j++){
    //         printf("%c",c[i][j]);
    //         printf(" ");
    //     }
    //     printf("\n");
    // }判断数据是否读入且是否合理
    
    int *queue=malloc(sizeof(int)*105);//模拟队列
    int *leaves=malloc(sizeof(int)*105);//叶子结点数组
    int cnt=0;//叶子节点数量
    int front=0,rear=0;//队列 头指针 尾指针
    queue[rear++]=root;//队列存入根节点
    while(rear>front){
        // printf("now 1st root is %d\n",root);
        if(c[root][left]!='-')queue[rear++]=c[root][left]-'0';//左节点入队列
        if(c[root][right]!='-')queue[rear++]=c[root][right]-'0';//右节点入队列
        if(c[root][left]=='-'&&c[root][right]=='-')leaves[cnt++]=root;//该节点为叶子节点 入叶子结点数组
        front++;//该节点上述已执行 进行下一节点判断
        if(front!=rear)//防止溢出+更换根节点
        root=queue[front];
        // for(int i=0;i<rear;i++)printf("%d ",queue[i]);
        // printf("\n");
    }
    for(int i=0;i<cnt-1;i++)printf("%d ",leaves[i]);
    printf("%d",leaves[cnt-1]);//无尾空格输出
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值