关于数据结构Mooc后的每一道答案
基本我都已经给出了详解
希望能对大家有所帮助
收藏一下也是方便大家查找吧
希望大家一起进步!
(c语言)浙大数据结构Mooc作者答案集
下面是关于这道题的谷歌翻译
再次修改
这道题之前图片和代码都贴错位置了
现在我也看不到原来我的思路和注释是什么了
评论区的hxd提醒了我一下 本来我还在刷力扣的又回来修改这道题的解析
我现在尽量把我原来写的给修改一下
----2021/2/26日改
关于这道题的思路
我真的是忘了这道题我之前怎么做的了
但是鉴于现在的我已经气力刚从寒假结束的恢复
已然没有精力再次做出这道题的完全解析了
我只能现在去找一个我觉得这道题做的比较详细的注释和思路分析的
来整了
下面就贴了一个我觉得最简洁最给力最清楚的解答
我看到这道题我就想到这个博主的解答 刚刚找了一会
下面我也会贴出来人家的代码 大家可以对比着看
我的代码相比而言更加冗长累赘 确实更不好一点:(
看思路大家可以移步去看一下 他的解答
2021/2/26
我的具体代码实现如下(无注释)
#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!