uva 699 uva 839 递归建树

uva 839 天平 Not so Mobile

链接戳这里
输入一个树状天平,根据力矩相等判断是否平衡。力矩相等即Wl * Dl = Wr * Dr,先序输入这颗树。若Wl 或 Wr为0,代表该砝码是子天平,接下来会描述这个子天平,2个都为0时,会先描述左子天平,后描述右子天平。

要注意的地方:
由于是先序遍历,未知左右子树的重量,可以用引用来递归获得重量。获得左右子树重量后进行力矩是否相等的判断。
但是别忘了,整颗树平衡,得是:左平衡+右平衡+根平衡。另外输出格式小心,一组之间空格。由于是一颗合法的树,所以输入的组与组之间不需特别判断。

#include 
#include 
using namespace std;

const int inf = 0x3f3f3f3f, maxN = 1e5 + 5;
int N, M;

bool solve(int &w) {
    int wl, dl, wr, dr;
    scanf("%d %d %d %d", &wl, &dl, &wr, &dr);
    bool okl = 1, okr = 1;
    if (!wl) okl = solve(wl);
    if (!wr) okr = solve(wr);
    w = wl + wr;
    return okl && okr && wl * dl == wr * dr;
}

int main() {
    int T, w;
    scanf("%d", &T);
    while (T--) {
        puts(solve(w) ? "YES" : "NO");
        if (T)
            puts("");
    }
    return 0;
}
uva 699 The Falling Leaves

链接戳这里
给一颗二叉树。左子节点在根的左1个单位,右子节点在根的右1个单位。让从左到右输出竖直方向所有节点权值之和。

    5
   / \
  7   3
   \
    6

如上例,应该输出7, 11, 3
这题乍一看还有点让人费解.但是把树的关系放在一个数组上,利用左右+-1的相对关系来"建"树,突然就变得很明朗。

#include 
#include 
using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
const int inf = 0x3f3f3f3f, maxN = 2001;
int N, M;
int sum[maxN];

void build(int rt) {
    int v;
    scanf("%d", &v);
    if (v == -1)
        return;
    sum[rt] += v;
    build(rt - 1);
    build(rt + 1);
}
bool init() {
    int v;
    scanf("%d", &v);
    if (v == -1)
        return 0;
    mst(sum, 0);
    int rt = maxN / 2;
    sum[rt] += v;
    build(rt - 1);
    build(rt + 1);
    return 1;
}

int main() {
    int T = 0;
    while (init()) {
        ++T;
        int cur = 0;
        while (sum[cur] == 0)
            ++cur;
        printf("Case %d:\n", T);
        int fg = 0;
        while (sum[cur] != 0) {
            if (!fg) fg = 1;
            else printf(" ");
            printf("%d", sum[cur++]);
        }
        puts("\n");
    }
    return 0;
}

你可能感兴趣的:(uva 699 uva 839 递归建树)