UVA 839 天平

本文介绍了一种通过数组存储方式构建二叉树并判断其是否为平衡二叉树的方法。利用后序遍历实现平衡性的校验,重点解决了数组大小不足导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值