首页 > 学院 > 开发设计 > 正文

【九度OJ】题目1176:树查找 解题报告

2019-11-06 07:27:58
字体:
来源:转载
供稿:网友

【九度OJ】题目1176:树查找 解题报告

标签(空格分隔): 九度OJ


http://ac.jobdu.com/PRoblem.php?pid=1176

题目描述:

有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。

输入:

输入有多组数据。 每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。

输出:

输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。

样例输入:

41 2 3 42

样例输出:

2 3

Ways

二叉树的性质。

首先考虑,这是要输出某一层的所有元素,那么这一层是否存在?再其次,这一层是完全的吗,是否有空的节点。

此处输入图片的描述

我们知道,每一层的叶子节点的最左边的元素是2^(deep -1),最右节点元素是2^deep-1,所以我可以根据这个判断deep和总数n之间的关系。

只要所求deep层的pow(2, deep - 1) <= n,那么此层必不为空。然后遍历该层,如果当前节点的下一个节点是0,说明下一个节点已经不存在了,那么,应该输出当前值,不空格,要换行;否则说明右边还有元素,再判断是否是最后元素,即是否满足i == pow(2, deep) - 1,同理判断是否留空格和换行。

因为二叉树的叶子记数是从1开始的,所以我在往数组里插入数字,以及读出的时候也是从1开始,不符合平时的数组习惯,注意不要出现问题。

#include <stdio.h>#include <math.h>int main() { int n; int tree[1002]; int deep; while (scanf("%d", &n) != EOF) { for (int i = 1; i <= n; i++) { scanf("%d", &tree[i]); } scanf("%d", &deep); if (pow(2, deep - 1) <= n) { for (int i = (int) pow(2, deep - 1); i < pow(2, deep); i++) { if (tree[i + 1] == 0) { printf("%d/n", tree[i]); break; } else { if (i == pow(2, deep) - 1) printf("%d/n", tree[i]); else printf("%d ", tree[i]); } } } else { printf("EMPTY/n"); } } return 0;}

Date

2017 年 3 月 4 日


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表