cjweffort

博客园 首页 联系 订阅 管理

http://ac.jobdu.com/problem.php?cid=1040&pid=35

题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:

如果序列相同则输出YES,否则输出NO

样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO

// 题目35:二叉排序树.cpp: 主项目文件。

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

const int N=13;

//bool flag;

typedef struct BitNode
{
	int value;
	BitNode *lchild,*rchild;
}BitNode,*BiTree;

void InserNode(BitNode *&root, int key)
{
	if(root==NULL)
	{
		root=(BitNode *)malloc(sizeof(BitNode));
		root->value=key;
		root->lchild=NULL;
		root->rchild=NULL;
	}
	else
	{
		if(root->value<key)
			InserNode(root->rchild,key);
		else if(root->value>key)
			InserNode(root->lchild,key);
		else
			return;
	}
}

bool isEqual(BitNode *&root1,BitNode *&root2)
{
	if(root1==NULL&&root2==NULL)
		return true;
	if(root1==NULL&&root2!=NULL)
		return false;
	if(root1!=NULL&&root2==NULL)
		return false;
	if(root1->value!=root2->value)
		return false;
	else
		return isEqual(root1->lchild,root2-

>lchild)&&
		isEqual(root1->rchild,root2->rchild);
}

int main()
{
	freopen("F:\\test.txt","r",stdin);
	freopen("F:\\output.txt","w",stdout);
	int n;
	while(cin>>n&&n!=0)
	{
		char str1[N];
		scanf("%s",str1);
		BitNode *root1=NULL;
		for(int i=0;str1[i];i++)
			InserNode(root1,str1[i]);
		while(n--)
		{
			char str2[N];
			scanf("%s",str2);
			BitNode *root2=NULL;
			for(int i=0;str2[i];i++)
				InserNode(root2,str2

[i]);
			if(isEqual(root1,root2))
				cout<<"YES"<<endl;
			else
				cout<<"NO"<<endl;
		}
	}
	return 0;
}


posted on 2013-03-05 11:30  cjweffort  阅读(108)  评论(0编辑  收藏  举报