1. 程式人生 > >UVA 839 & UVA699

UVA 839 & UVA699

二叉樹DFS

1.遞迴建樹+在樹上遞迴計算答案 839

2.直接遞迴計算答案 699

UVA 839

這題注意一下輸出格式就好了

#include<cstdio>
#include<cstdlib>
using namespace std;
struct Node{
	int w,d;
	Node *right,*left;
};
Node *newnode(void)
{
	Node *T=new Node;
	T->d=T->w=0;
	T->left=T->right=NULL;
	return T;
}
Node * Build(Node *T)//遞迴建樹 
{
	int wl=0,dl=0,wr=0,dr=0;
	scanf ("%d %d %d %d",&wl,&dl,&wr,&dr);
	if (wl==0)//描述子天平 
	{
		T->left=newnode();
		T->left->d=dl;
		T->left=Build(T->left);
	}
	else
	{
		T->left=newnode();
		T->left->w=wl;
		T->left->d=dl;
	}
	if (wr==0)
	{
		T->right=newnode();
		T->right->d=dr;
		T->right=Build(T->right);
	}
	else
	{
		T->right=newnode();
		T->right->w=wr;
		T->right->d=dr;
	}
	if (T->w==0&&T->left!=NULL&&T->right!=NULL)
		T->w=T->right->w+T->left->w;
	return T;
}
bool  DFS(Node *T)//遞迴計算 
{
	if (T->left==NULL&&T->right==NULL)
		return true;
	else if (T->left!=NULL&&T->right!=NULL)
	{
		if (DFS(T->left)&&DFS(T->right)&&T->left->w*T->left->d==T->right->w*T->right->d)
			return true;
		else
			return false;
	}
}
void PreOrder(Node *T)
{
	if (T==NULL)
		return ;
	printf ("%d\n",T->w);
	PreOrder(T->left);
	PreOrder(T->right);
}
int main()
{
	int n;
	scanf ("%d",&n);
	while(n--)
	{
		Node *T=newnode();
		T=Build(T);
		if (DFS(T))
			printf ("YES\n");
		else
			printf ("NO\n");
		delete T;
		if (n!=0)
			printf ("\n");
	}
	return 0;
}

UVA 699

這題沒建樹,直接開兩個陣列存值就行了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int l,r;
const int MAXN=1000;
int L[MAXN],R[MAXN];
void DFS(int num)
{
	int x,y;
	scanf ("%d",&x);// 左子樹 
	if (x!=-1)
	{
		int a=num-1;
		if (a<0)
		{
			L[-a]+=x;
			l=min(l,a);
		}
		else if (a>0)
		{
			R[a]+=x;
			r=max(r,a);
		}
		else 
			L[0]+=x;
		DFS(a);
	}
	scanf ("%d",&y);//右子樹
	if (y!=-1)
	{
		int a=num+1;
		if (a<0)
		{
			L[-a]+=y;
			l=min(l,a);
		}
		else if (a>0)
		{
			R[a]+=y;
			r=max(r,a);
		}
		else
			L[0]+=y;
		DFS(a);
	} 
}
int main()
{
	int n,Case=1,x;
	while (~scanf ("%d",&n) && n!=-1)
	{
		memset(L,0,sizeof(L));
		memset(R,0,sizeof(R));
		L[0]=n;
		l=r=0;
		DFS(0);
		printf ("Case %d:\n",Case++);
		printf ("%d",L[-l]);
		for (int i=-l-1;i>=0;i--)
		{
			printf (" %d",L[i]);
		}
		for (int i=1;i<=r;i++)
		{
			printf (" %d",R[i]);
		}
		printf("\n\n");
	}
	return 0;
}