水题。。不过貌似可以不建树。。。我还是建树了。。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<malloc.h>
using namespace std;
int ok;
struct Tree
{
int Weight; /*重量*/
int Length; /*长度*/
Tree *Left;
Tree *Right;
};
void BuildTree(Tree *node){
int w1,l1,w2,l2;
scanf("%d%d%d%d",&w1,&l1,&w2,&l2);
if(w1 == 0){
Tree *node_L = (Tree*)malloc(sizeof(Tree));
node_L -> Length = l1;
node_L -> Weight = 0;
node -> Left = node_L;
BuildTree(node_L);
}
else if(w1 != 0){
Tree *node_L = (Tree*)malloc(sizeof(Tree));
node_L -> Weight = w1;
node_L -> Length = l1;
node_L -> Left = NULL;
node_L -> Right = NULL;
node -> Left = node_L;
}
if(w2 == 0){
Tree *node_R = (Tree*)malloc(sizeof(Tree));
node_R -> Length = l2;
node_R -> Weight = 0;
node -> Right = node_R;
BuildTree(node_R);
}
else if(w2 != 0){
Tree *node_R = (Tree*)malloc(sizeof(Tree));
node_R -> Weight = w2;
node_R -> Length = l2;
node_R -> Left = NULL;
node_R -> Right = NULL;
node -> Right = node_R;
}
}
int dfs(Tree *node){
if(node -> Weight == 0)
node -> Weight = dfs(node -> Left)+dfs(node -> Right);
return node -> Weight;
}
void Get_Tree(Tree *node){
if(node -> Left != NULL){
int x = ((node -> Left)->Weight)*((node -> Left)->Length);
int y = ((node -> Right)->Weight)*((node -> Right)->Length);
if(x != y){
ok = 0;
return ;
}
Get_Tree(node -> Left);
Get_Tree(node -> Right);
}
}
int main()
{
int N;
scanf("%d",&N);
for(int Case = 1; Case <= N; Case ++){
Tree *root = (Tree*)malloc(sizeof(Tree));
root -> Weight = 0;
root -> Length = 0;
BuildTree(root);
dfs(root);
ok = 1;
Get_Tree(root);
if(ok)
printf("YES");
else
printf("NO");
printf("\n");
if(Case < N)
printf("\n");
}
return 0;
}