2015年8月26日 星期三

[UVA] 699 - The Falling Leaves

題意:
遞迴輸入一棵二元樹,
若子節點是葉子則輸入-1,
最後輸出由左到右的垂直節點的權值和,













輸入: 9 5 3 -1 7 -1 -1 4 -1 -1 8 1 -1 6 -1 -1 -1
就會建出像這樣一棵二元樹,
最後由左邊開始輸出每一垂直線的加總,
3 (5+7) (9+4+1) (8+6)
所以是3 12 14 14

每一個測資後面要一個空行(最後一筆也要)。


--------------------------------------------------

方法:
若子節點不是葉子表示還有子樹要輸入,
所以再進去遞迴,
我以位置10000為根節點,
輸入左節點就在位置9999加上左節點的數字,
輸入右節點就在位置10001加上右節點的數字,
最後再從0開始去找第一個非零的數字開始去輸出~

--------------------------------------------------


/* 20150826
 * hanting
 * UVa 699 - The Falling Leaves
 * C++
 */
#include <iostream>
#include <cstring>//memset
using namespace std;
int sum[20000];
void input(int cur)
{
    int L,R;
    cin>>L;
    if(L!=-1)
    {
        sum[cur-1]+=L;
        input(cur-1);
    }
    cin>>R;
    if(R!=-1)
    {
        sum[cur+1]+=R;
        input(cur+1);
    }
}
int main()
{
    int caseN=1;
    int root;
    while(cin>>root and root != -1)
    {
        memset(sum,0,sizeof(sum));
        sum[10000]=root;
        input(10000);
        cout<<"Case "<<caseN++<<":"<<endl;

        int i=0;
        for(;i<20000;i++)
        {
            if(sum[i]!=0)
            {
                cout<<sum[i];
                i++;
                break;
            }
        }
        for(;i<20000;i++)
        {
            if(sum[i]==0) break;
            cout<<" "<<sum[i];
        }
        cout<<endl<<endl;
    }
    return 0;
}

沒有留言:

張貼留言