一、题意

有若干组输入数据。
每组中按先序遍历给出一棵树的所有结点,-1表示空树。
要求从左至右输出每个竖直位置的所有结点的权值之和。

二、解析

递归输入。然后用需要维护一个offset值在递归当中作为当前的水平位置偏移。然后用map将权值和存放起来即可。

三、代码

#include <iostream>
#include <map>
using namespace std;
int kase = 1;
map<int, int> ans;

bool input(int offset) {
    int x;
    cin >> x;
    if(x == -1) return 1;
    ans[offset] += x;
    input(offset - 1);
    input(offset + 1);
    return 0;
}

int main() {
    while(1) {
        ans.clear();
        if(input(0)) break;
        cout << "Case " << kase ++ << ":\n";
        bool first = 1;
        for(auto p : ans) {
            if(first) first = 0;
            else cout << " ";
            cout << p.second;
        }
        cout << "\n" << endl;
    }
}

四、归纳

  • 只要不超时就大胆用map存放数据,因为很方便