1. 程式人生 > >UVA699 The Falling Leaves 遞迴建樹

UVA699 The Falling Leaves 遞迴建樹

題意翻譯

每年秋天,在中北部地區葉子的顏色都會變得鮮豔,樹葉也迅速地跟著落下。如果同樣的事情發生了在二叉樹上,那麼這些樹葉堆有多大? 我們假設一個二叉樹中的每個節點都會在那個節點落下一個等於整數值的葉子數。 我們還假設這些葉子垂直地落在地上(謝天謝地,沒有風吹過他們周圍)。最後,我們假設節點是水平放置的。這樣一個節點的左、右子節點恰好是一個左邊的單位,另一個是一個右邊的單位 考慮右邊的下面的樹: 包含5和6的節點具有相同的水平位置。(當然,有不同的垂直位置)。 節點包含7是一個單位,左邊的那些包含5和6,包含3的節點是其右邊的一個單位。什麼時候。“葉子”從這些節點上落下,形成三個堆:最左邊的一個有7片(最左邊的節點)下一個有11片(包含5和6的節點中葉片數之和),以及最右邊的堆有3片。

輸入

輸入包含多個詢問,每組詢問描述一個樹。樹是先指定給在根節點中的值,之後是左子樹的描述,然後是右子樹的描述。如果為空子樹,則值為“- 1”。因此,上圖顯示的樹是給定的。 “5 - 7 - 1 - 6 - 1 - 1 - 3 - 1 - 1”。每個實際樹節點都包含一個正的非零值。最後的測試詢問後面是一個‘-1’

輸出

對於每一個詢問,在一行中顯示用例號(它們按順序編號,以1開始)。 本身。在下一行顯示每一堆的“葉子”的數目,從左到右,用一個 (空格) 分隔每個值的空間。每兩個詢問之間用一個空白行隔開。此輸出必須從第1行開始,並且不會超過80行。按空白行跟蹤每個詢問的輸出。此格式見樣例輸出 翻譯貢獻者UID:75392

題目描述

PDF

輸入輸出格式

輸入格式:

輸出格式:

輸入輸出樣例

輸入樣例#1: 複製

5 7 -1 6 -1 -1 3 -1 -1
8 2 9 -1 -1 6 5 -1 -1 12 -1
-1 3 7 -1 -1 -1
-1

輸出樣例#1: 複製

Case 1:
7 11 3
Case 2:
9 7 21 15

很簡單的遞迴建樹,唯一的問題就是根節點在陣列中位置不能為0,否則會越界

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int maxn = 1000010;
int kase,sum[maxn];

void build(int cur)
{
    int x;
    scanf("%d", &x);
    if (x == -1)
        return;
    sum[cur] += x;
    build(cur - 1);
    build(cur + 1);
}

bool init()
{
    memset(sum, 0, sizeof(sum));
    int x;
    scanf("%d", &x);
    if (x == -1)
        return false;
    int cur = maxn / 2;
    sum[cur] += x;
    build(cur - 1);
    build(cur + 1);

    return true;
}

int main()
{
    while (init())
    {
        printf("Case %d:\n", ++kase);
        int p = 0;
        while (!sum[p])
            p++;
        printf("%d", sum[p++]);
        for (int i = p; sum[i]; i++)
            printf(" %d", sum[i]);
        printf("\n");
        printf("\n");
    }

    return 0;
}