题目大意:给出一个杠杆,判断是否平衡。
解题思路:分别建两棵树,里面放重量,和对应的距离。然后后序的方式判断每一个小杠杆是否平衡。因此要先判断00情况,然后0x情况,然后x0情况,最后才是xy情况。反着的话,当0x的情况解决完后,情况就变成例了yx的情况,所以xy要放在最后。
#include<stdio.h>
int t;
struct tree {
int v, d;
tree *left, *right;
tree (int a, int b) {v = a; d = b; left = NULL; right = NULL;}
} *head1 = NULL ,*head2 = NULL;
void buildtree( tree *&p1, tree *&p2) {
int w1, w2, d1, d2;
scanf("%d%d%d%d", &w1, &d1, &w2, &d2);
p1 = new tree(w1, d1);
p2 = new tree(w2, d2);
if(w1 == 0)
buildtree(p1->left, p1->right);
if(w2 == 0)
buildtree(p2->left, p2->right);
}
void clear(tree *&p) {
if(p != NULL) {
clear(p->left);
clear(p->right);
delete(p);
p = NULL;
}
}
int isbalance(tree *p1, tree * p2) {
if(p1 != NULL && p2 != NULL) {
if(p1->v == 0 && p2 ->v == 0) {
p1->v = isbalance(p1->left, p1->right);
p2->v = isbalance(p2->left, p2->right);
}
if(p1->v != 0 && p2->v == 0)
p2->v = isbalance(p2->left, p2->right);
if(p1 ->v == 0 && p2->v != 0)
p1->v = isbalance(p1->left, p1->right);
if(p1->v != 0 && p2->v != 0) {
if(p1->v >0 && p2->v > 0 && p1->v * p1->d == p2->d * p2->v)
return p1->v + p2->v;
return -1;
}
}
}
int main() {
scanf("%d", &t);
while(t--) {
buildtree(head1, head2);
if(isbalance(head1, head2) > 0)
printf("YES\n");
else
printf("NO\n");
if(t)
printf("\n");
clear(head1);
clear(head2);
}
return 0;
}