之前WA两次的原因:数组开的不够大。。。。
先建二叉树,我采用的数组存储方式
再后序遍历比较是否平衡
//WA:数组开的不够大。。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<memory>
#include<queue>
using namespace std;
///
struct node{
int wL;
int dL;
int wR;
int dR;
int left;
int right;
};
node tree[10000];
int pos;
bool flag;
void build(int parent, bool lr)
{
pos++;
node tempnode;
scanf("%d", &tempnode.wL);
scanf("%d", &tempnode.dL);
scanf("%d", &tempnode.wR);
scanf("%d", &tempnode.dR);
tempnode.left = 0;
tempnode.right = 0;
tree[pos] = tempnode;
if (lr)
{
tree[parent].left = pos;
}
else
tree[parent].right = pos;
//
int thispos;
thispos = pos;
if (tempnode.wL == 0)
{
build(thispos, true);
}
if (tempnode.wR == 0)
{
build(thispos, false);
}
}
int travel(int pos)
{
int sumL = 0;
int sumR = 0;
if (tree[pos].left != 0)
{
sumL += travel(tree[pos].left);
}
if (tree[pos].right != 0)
{
sumR += travel(tree[pos].right);
}
if (!flag)
return 0;
if (( (tree[pos].wL + sumL) * tree[pos].dL) == ( (tree[pos].wR + sumR)* tree[pos].dR))
{
flag = true;
}
else
{
flag = false;
}
return tree[pos].wL + sumL + tree[pos].wR + sumR;
}
int main()
{
///
int i, j;
int nCases;
scanf("%d", &nCases);
while (nCases--)
{
memset(tree, 0, sizeof(tree));
pos = 0;
build(0, true);
pos = 1;
flag = true;
travel(1);
if (flag)
{
printf("YES\n");
}
else
printf("NO\n");
if (nCases != 0)
{
printf("\n");
}
}
return 0;
}