题目
- 参考网址:https://vjudge.net/problem/UVA-839
- 大意:
根据干杠平衡原理,判断题目所给出的数据组成的天平能否平衡。注意,此天平可能包含子天平。输入时,如果w为0,则表示包含子天平,子天平按照先左后右的方法输入。(书上感觉没有解释清楚,如果子天平不平衡则整个天平是不平衡的)
知识点
- 递归遍历二叉树
思路
这题就是考遍历二叉树,难度不大,一开始写的相对紫书作者写的复杂咯。输入相当于就是一个先序遍历,遇到wl或者wr为0,说明有子树,向下递归,直到wl或者wr不为0,到达叶子节点。每次递归返回 left_ok && right_ok && (wl * dl == wr * dr),如果子天平不平衡那么父天平也不平衡。
代码
# include <cstdio>
using namespace std;
bool fun(int & w) {
bool left_ok = true, right_ok = true; // 天平左右端初始化平衡
int wl, dl, wr, dr;
scanf("%d %d %d %d", &wl, &dl, &wr, &dr);
if(!wl) // 为0,有子天平
left_ok = fun(wl); // 递归 -> 子天平
if(!wr) // 为0,有子天平
right_ok = fun(wr); // 递归 -> 子天平
w = wl + wr; // 引用,将父天平左/右端的weight设置为子天平两端之和
return left_ok && right_ok && (wl * dl == wr * dr);
}
int main() {
int n = 1,w = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
if (fun(w)) // true
printf("YES");
else // false
printf("NO");
}
return 0;
}
过程中遇到的问题 & 解决
- 作者巧妙地用了“&”引用(我是没想到的!秒啊!),这样的话直接可以将将父天平左/右端的weight赋值为子天平两端之和
- 作者提示:题目比较抽象,可以画个示意图
测试
输入:
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
结果:
YES