7-4 List Leaves_弱爆了的雪饼的博客-程序员秘密

技术标签: List Leaves  PTA  算法与数据结构  

Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a "-" will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each test case, print in one line all the leaves' indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.

Sample Input:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

Sample Output:

4 1 5

 

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100

//树结点结构 
typedef struct TNode{
	int Left;  //指向左子树的指针
	int Right; 
}Tree;

//循环队列元素结构 
struct QNode {
    int *Data;     /* 存储元素的数组 */
    int Front, Rear;       /* 队列的头、尾指针 */
    int MaxSize;           /* 队列最大容量 */
};
typedef struct QNode *Queue;

void LevelOrderTraversal(Tree a[],int Root);

int main()
{
	int N;
	char u,v;
	int son[15] = {0};  //将会用来判断哪个结点是根结点 
	int root;  //二叉树的根结点 
	Tree a[15] = {-1};
	
	scanf("%d",&N);
	getchar(); //吸收掉换行符 
	for(int i=0; i<N; i++){
		scanf("%c %c",&u,&v);
		if(u == '-'){
			u = -1;  //没有儿子,指针设为-1
		}else{
			u = u-'0';
			son[u] = 1; //有指针指向的结点、在son[]数组里设为1 
		}
		if(v == '-'){
			v = -1;  //没有儿子,指针设为-1
		}else{
			v = v-'0';
			son[v] = 1;
		}
		a[i].Left = u;  //数组的下标代表了这个结点的指针 
		a[i].Right = v;
		getchar();  //吸收掉换行符 
	}
    /*寻找根结点*/ 
	for(root=0; root<N && son[root]==1; root++);   
	LevelOrderTraversal(a,root);
	
	return 0;
}

//创建空循环队列 
Queue CreateQueue( int MaxSize )
{
    Queue Q = (Queue)malloc(sizeof(struct QNode));
    Q->Data = (int *)malloc(MaxSize * sizeof(int));
    Q->Front = Q->Rear = 0;
    Q->MaxSize = MaxSize;
    return Q;
}

//判队循环队列空 
bool IsEmptyQ( Queue Q )
{
    return (Q->Front == Q->Rear);
}

//判队循环队列满 
bool IsFullQ( Queue Q )
{
    return ((Q->Rear+1)%Q->MaxSize == Q->Front);
}

//循环队列的插入 
bool AddQ( Queue Q, int X )
{
    if ( IsFullQ(Q) ) {
        printf("队列满\n");
        return false;
    }
    else {
        Q->Rear = (Q->Rear+1)%Q->MaxSize;
        Q->Data[Q->Rear] = X;
        return true;
    }
}

//循环队列的删除
int DeleteQ( Queue Q )
{
    if ( IsEmptyQ(Q) ) { 
        printf("队列空\n");
        //return;
    }else{
        Q->Front = (Q->Front+1)%Q->MaxSize;
        return  Q->Data[Q->Front];
    }
}

/********层序遍历*******/
void LevelOrderTraversal(Tree a[],int Root)
{
	Queue Q;
	int r,ans = 1;
	if( Root == -1 )  return;  //如果Root为-1,说明不存在根结点,则直接返回 
	Q = CreateQueue(MAXSIZE);  //创建并初始化队列 Q
	AddQ(Q,Root);
	while( !IsEmptyQ(Q) ){
		r = DeleteQ(Q);  
		if(a[r].Left == -1 && a[r].Right == -1){  /*访问取出队列的结点*/ 
			if(ans){
				printf("%d",r);
				ans = 0;
			}else{
				printf(" %d",r);
			}
		}
		if(a[r].Left != -1)  AddQ(Q,a[r].Left);    //访问左右儿子 
		if(a[r].Right != -1)  AddQ(Q,a[r].Right);
	}
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Authur520/article/details/84863847

智能推荐

Linux下载并安装JDK1.8_Future_LL的博客-程序员秘密

一、下载并配置下载地址:点击下载 使用命令进行解压 我们要将解压后的【jdk1.8.0_131】里面的所有数据移动到我们需要安装的文件夹当中,我们打算将jdk安装在usr/java当中,我们在usr目录下新建一个java文件夹 将【jdk1.8.0_131】里的数据拷贝至java目录下 修改环境变量 在打开的文件结尾添加如下的代码 export JA...

IDEA之常用模板设置_idea模板设置_Javxuan的博客-程序员秘密

1.代码格式设置1.1 idea设置类注释模板idea默认类注释文件为File Header.java,代码为/** * Created by ${USER} on ${DATE}. */设置自己的类注释文件 class desc 步骤为: 注释代码为:/** * @Description * @Author xiaoqx &amp;lt;Javxua...

arch Linux更新添加源,Arch Linux 更新源(以清华 arch 源为例)_老光私享的博客-程序员秘密

【leedcode】longest-substring-without-repeating-charactersGiven a string, find the length of the longest substring without repeating characters. Examples: Giv ...tar命令的详细解释tar命令的详细解释 标签:linuxfileoutput...

python开发_常用的python模块及安装方法_aaa233242312的博客-程序员秘密

adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:连接MySQL数据库的...

leetcode139——WordBreak_tzyshiwolaogongya的博客-程序员秘密

题目大意:拆分字符串,判断拆分后的几个字符串是否都存在于字典中。分析:思路:dfs从每个位置拆分字符串,前缀在字典里的前提下继续dfs字符串的另一半,直到整个字符串作为前缀时也存在于字典中实际方法:动态规划(因为dfs时间复杂度太高,超时)。dp含义:dp[i]——s[0,i-1]是否满足题意(字符串前i位是否符合要求)初始化:dp[0] = true 因为空串默认存在于字典中...

获得应用程序的当前路径_Tinna_zhang的博客-程序员秘密

//得到应用程序路径  1int  i   =   0; char  szExeFilePath[512]   =   _T( " "); GetModuleFileName(hInstance,szExeFilePath,512); i   =   strlen(szEx

随便推点

通过JAVASCRIPT使网站内容无法被复制_联安的博客-程序员秘密

如果自己写完网页,为了保护自己的内容不被抄袭,可以通过添加以下代码,有效防止浏览者按“Ctrl+C”及鼠标右键进行复制操作。&lt;script type="text/javascript"&gt;function copy() { alert('禁止复制') } function copy1() { if (event.button == 2) { alert('禁止复制') } } f...

Android事件分发机制:基础篇:最全面、最易懂。_程序引力的博客-程序员秘密

如何提升安卓水平?安卓开发者必须了解的事件分发机制。最全面、最易懂的形式来讲解Android事件分发机制。0. 前言鉴于安卓分发机制较为复杂,故分为多个层次进行讲解,分别为基础篇、实践篇与高级篇。(一)基础篇:从基本概念入手,介绍了分发机制中的核心方法,通过分析其核心逻辑,总结其事件分发机制。(二)实践篇:该篇设计了简单与复杂的两个demo样例,从现象与应用的角度去讲解分发机制的核心...

Kafka源码篇 No.2-Producer如何获取元数据_pezynd的博客-程序员秘密

第1章 简介经过上一篇文章的讲解,大致了解了Producer发送消息的流程,本篇文章我们阅读以下Producer获取元数据的详细步骤。第2章 详细步骤2.1 sender线程拉取元数据sender线程启动以后,会执行run()=&gt;runOnce()=&gt;client.poll()执行kafka client的网络请求开始执行如下代码。@Overridepublic List&lt;ClientResponse&gt; poll(long timeout, long now)

java23种设计模式--适配器模式(Adapter Pattern)_weixin_34407348的博客-程序员秘密

著名的设计模式“四人帮”这样评价适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four这篇来介绍一下适配器模式(Adapter Pattern),在实际生活中也有很多类似于适配器的例子,例如国外有些电压是110V而国内电压是220V,那么从国外带回国内使用的电器需要有一个变压器才能正常...

实体消歧、实体统一和指代消歧_lhz泽少的博客-程序员秘密

实体消歧实体消歧主要是指:一个词可能含有多个意思,不同的上下文表达的含义可能也不一样例如:今天苹果发布了新手机对于“苹果”我们怎么判断?对于实体消歧来说我们得有一个实体库,库中包含每个实体,以及它所包含的意思,例如:“苹果”在实体库中有两个含义:苹果:水果的一种苹果:美国的一家高科技公司那么对于:今天苹果发布了新手机。这样一句话我们提取“苹果”前后大约30个词左右和并利用两个含义形...

基于Flink+kafka实时告警_flink 告警规则_钦拆大仁的博客-程序员秘密

某项目使用告警系统的逻辑是将实时数据保存到本地数据库再使用定时任务做判断,然后产生告警数据。这种方式存在告警的延时实在是太高了。数据从产生到保存,从保存到判断都会存在时间差,按照保存数据定时5分钟一次,定时任务5分钟一次。最高会产生10分钟的误差,这种告警就没什么意义了。