遞迴輸入一棵二元樹,
若子節點是葉子則輸入-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;
}
沒有留言:
張貼留言