(c语言)List Leaves (25分)

关于数据结构Mooc后的每一道答案
基本我都已经给出了详解
希望能对大家有所帮助
收藏一下也是方便大家查找吧
希望大家一起进步!

(c语言)浙大数据结构Mooc作者答案集

下面是关于这道题的谷歌翻译
在这里插入图片描述




再次修改

这道题之前图片和代码都贴错位置了
现在我也看不到原来我的思路和注释是什么了
评论区的hxd提醒了我一下 本来我还在刷力扣的又回来修改这道题的解析
我现在尽量把我原来写的给修改一下
----2021/2/26日改


关于这道题的思路

我真的是忘了这道题我之前怎么做的了
但是鉴于现在的我已经气力刚从寒假结束的恢复
已然没有精力再次做出这道题的完全解析了
我只能现在去找一个我觉得这道题做的比较详细的注释和思路分析的
来整了

在这里插入图片描述
下面就贴了一个我觉得最简洁最给力最清楚的解答
我看到这道题我就想到这个博主的解答 刚刚找了一会
下面我也会贴出来人家的代码 大家可以对比着看
我的代码相比而言更加冗长累赘 确实更不好一点:(
看思路大家可以移步去看一下 他的解答
2021/2/26

执念斩长河的List Leaves解答 十分清晰给力




我的具体代码实现如下(无注释)

#include <stdio.h>
#define max 10
#define Null -1
#define false -1
#define true 1
typedef int bool;
typedef int Tree;
struct TreeNode
{
    Tree Data;
    Tree Left;
    Tree Right;
};
struct TreeNode T[max];
int Build(struct TreeNode T[]);
void print(Tree Root);
int LeavesNumber=0;
int main()
{
   Tree Root;
   Root = Build(T);
   print(Root);
   return 0;
}

int Build(struct TreeNode T[])
{
    Tree Root = Null;
    int N,i;
    char templeft,tempright;
    scanf("%d",&N);
    int Check[max] = {0};
    if(N)
    {
        for(i=0;i<N;i++)
        {
            getchar();
            scanf("%c %c",&templeft,&tempright);
            if(templeft != '-')
            {
                T[i].Left = templeft - '0';
                Check[T[i].Left] = Null;
            }
            else
                T[i].Left = Null;
            if(tempright != '-')
            {
                T[i].Right = tempright - '0';
                Check[T[i].Right] = Null;
            }
            else
                T[i].Right = Null;
            if(tempright== '-' && templeft== '-')
                LeavesNumber++;
            T[i].Data = i;
        }
        for(i=0; i<N; i++)
        {
            if(!Check[i])
                break;
        }
        Root = i;
    }
    return Root;
}

void print(Tree Root)
{
    if(Root!=Null)
    {
        Tree p;
    int queue[max] = {0};
    int rear = -1,front = -1;
    queue[++rear] = Root;
    while(front != rear)
    {
        p = T[queue[++front]].Data;
        if(T[p].Left != Null)
            queue[++rear] = T[p].Left;
        if(T[p].Right != Null)
            queue[++rear] = T[p].Right;
        if(T[p].Left == Null && T[p].Right == Null)//如果层序遍历可以直接删除这个 哦耶!:)
        {
            if(--LeavesNumber)
            printf("%d ",p);
            else
            printf("%d",p);
        }
    }
    }
    return;
}


执念斩长河的具体代码实现(含注释)

#include<stdio.h>
struct node{
	int data;
	int left;
	int right;
}tr[10];
//这种定义貌似跟树的同构定义相同
int main()
{
	int N,i,M=0;//数叶子的个数
	int check[10]={0};
	scanf("%d",&N);//确定有多少个叶节点
	getchar();//输入回车,getchar代替
	for(i=0;i<N;i++)
	{
		char l,r;
		scanf("%c %c",&l,&r);
		getchar();//输入回车,getchar代替
		if(l=='-' && r=='-') M++;//发现叶子
		tr[i].data=i;
		tr[i].left = l=='-'?-1:l-'0';
		tr[i].right = r == '-'?-1:r-'0';
		if(l!='-') check[l-'0'] = 1;
		if(r!='-') check[r-'0'] = 1;
		
	}
	
	int queue[10]={0},rear=-1,front=-1;
	struct node p;
	for(i=0;i<N;i++)
		if(check[i]==0)
			queue[++rear]=i;
	while(front!=rear){
		p=tr[queue[++front]];
		if(p.left!=-1) queue[++rear]=p.left;//从根节点开始向队尾插入左孩子
		if(p.right!=-1) queue[++rear]=p.right;//从根节点开始向队尾插入右孩子
		if(p.left == -1 && p.right ==-1)//对叶子定义要熟悉
		{
			printf("%d",p.data);
			M--;
			if(M) printf(" ");
		}
		
		
	}	
	return 0;
}

Have fun of coding!

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值