先贴个自己写的:
#include <cstdio>
int flag;
struct Node {
int LV, L, RV, R;
int V;
Node* LChild, * RChild;
Node(int a, int b, int c, int d) :LV(a), L(b), RV(c), R(d) {
V = 0;
LChild = NULL;
RChild = NULL;
}
};
int build(Node** root) {
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
*root = new Node(a, b, c, d);
if (a == 0)a = build(&(*root)->LChild);
if (c == 0)c = build(&(*root)->RChild);
if (a * b != c * d) { flag = false; }
return (*root)->V = a + c;
}
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
int T;
scanf("%d", &T);
while (T--) {
Node* root;
flag = true;
build(&root);
printf("%s\n", flag ? "YES" : "NO");
if (T)printf("\n");
}
return 0;
}
写完后发现代码里的Node完全是多余的。下面贴紫书的代码:
// UVa839 Not so Mobile
// Rujia Liu
// 题意:输入一个树状天平,根据力矩相等原则判断是否平衡。采用递归方式输入,0表示中间结点
// 算法:在“建树”时直接读入并判断,并且无须把树保存下来
#include<iostream>
using namespace std;
// 输入一个子天平,返回子天平是否平衡,参数W修改为子天平的总重量
bool solve(int& W) {
int W1, D1, W2, D2;
bool b1 = true, b2 = true;
cin >> W1 >> D1 >> W2 >> D2;
if(!W1) b1 = solve(W1);
if(!W2) b2 = solve(W2);
W = W1 + W2;
return b1 && b2 && (W1 * D1 == W2 * D2);
}
int main() {
int T, W;
cin >> T;
while(T--) {
if(solve(W)) cout << "YES\n"; else cout << "NO\n";
if(T) cout << "\n";
}
return 0;
}
对比明显。。