03-树2 List Leaves(浙大数据结构PTA习题)

03-树2 List Leaves

分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学

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

代码长度限制:16 KB 时间限制:400 ms 内存限制:64 MB

题目解析:

题目大意:给定一系列树的结点,按照从上到下,从左到右的顺序输出这棵树的叶子结点

关键点1:找到树的根结点

关键点2:根据树的根结点以及其它一系列结点构建树

采用递归的思路,如果根结点的左子树不为空,则递归构建左子树,否则为NULL;如果根结点的右子树不为空,则递归构建右子树,否则为NULL;

关键点3:按照从上到下,从左到右的顺序输出这棵树的叶子结点

本质是树的层序遍历问题,借助队列实现;

参考代码:

cpp 复制代码
# include<stdio.h>
# include<stdbool.h>
# include<stdlib.h>
# define MAXNODE 10 

typedef char ElementType;

typedef struct TreeNode* Tree;
struct TreeNode{
	ElementType info,left,right;
	Tree Left;
	Tree Right;
};

Tree Create(); 
Tree InitialTree(Tree Array[],int N);
Tree CreateTree(Tree Array[],Tree Root);
void InOrderPrint(Tree tree);

int main(){
	// 根据输入创建树 
	Tree tree = Create();
	// 对这棵树进行层序遍历,并输出叶子结点
	InOrderPrint(tree); 
	return 0;
}

// 对一棵树进行层序遍历,并输出叶子结点
void InOrderPrint(Tree tree){
	// 创建一个结点指针队列	
	Tree Queue[MAXNODE];
	int Rear=-1, Head = -1;
	// 压入根结点
	Queue[++Rear] = tree;
	// 用于格式化输出的统计
	int count = 0; 
	while(Rear!=Head){
		// 从队列出队一个结点,并判读是否是叶节点 
		Tree tmp = Queue[++Head];
		if(tmp->Left == NULL && tmp->Right==NULL){
			if(count==0){
				printf("%d",tmp->info-'0');
				count++;
			}
			else printf(" %d",tmp->info-'0');
		}
		// 分别压入其左右结点(若不为空)
		if(tmp->Left)Queue[++Rear] = tmp->Left;
		if(tmp->Right)Queue[++Rear] = tmp->Right; 
	} 
	return;
	 
} 
 

// 根据输入创建一棵树
Tree Create(){
	int N;
	scanf("%d",&N);
	getchar();
    if(N==0)return NULL;
	Tree Array[N];
	// 将信息存入指针数组中并获得树的根结点
	Tree Root = InitialTree(Array,N);
	// 通过树的根结点来建立树 
	Tree tree = CreateTree(Array,Root);
	return tree; 
} 

// 将结点信息存入指针数组中,并返回树的根结点 
Tree InitialTree(Tree Array[],int N){
	// Check数组用来标记结点是否作为了子节点 
	int i,Check[N];
	for(i=0;i<N;i++)Check[i] = 1;
	// 读入结点信息,并判读每个结点是否作为了子节点 
	for(i=0;i<N;i++){
		Tree node = (Tree)malloc(sizeof(struct TreeNode));
		node->info = '0'+i;
		node->left = getchar();
		if(node->left!='-')Check[node->left-'0'] = 0;
		getchar();
		node->right = getchar();
		if(node->right!='-')Check[node->right-'0'] = 0;
		getchar();
		node->Left = node->Right = NULL;
		Array[i] = node;
	}
	for(i=0;i<N;i++){
		if(Check[i]==1)break;
	}
	return Array[i];
}

// 根据指针数组及根结点递归构建一棵树
Tree CreateTree(Tree Array[],Tree Root){
	int i,count;
	// 递归构建左子树 
	if(Root->left == '-'){
		Root->Left = NULL;
	}else{
		Root->Left = CreateTree(Array,Array[Root->left-'0']);
	}
	// 递归构建右子树
	if(Root->right == '-'){
		Root->Right = NULL;
	}else{
		Root->Right = CreateTree(Array,Array[Root->right-'0']);
	}
	return Root;
} 

运行结果:

相关推荐
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
土司大王1 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹1 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王1 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
爱吃苹果的日记本2 小时前
数据结构第三课(时间复杂度)
数据结构·学习
罗西的思考3 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
Logic1013 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和
无小道4 小时前
C++——列表初始化
c++·列表初始化
小哈里4 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程