标签(空格分隔): 九度OJ
http://ac.jobdu.com/PRoblem.php?pid=1176
有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。
输入有多组数据。 每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。
输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。
二叉树的性质。
首先考虑,这是要输出某一层的所有元素,那么这一层是否存在?再其次,这一层是完全的吗,是否有空的节点。
我们知道,每一层的叶子节点的最左边的元素是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;}2017 年 3 月 4 日
新闻热点
疑难解答