题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:
如果序列相同则输出YES,否则输出NO
样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
#include
#include
struct Node {
int i;
Node *left;
Node *right;
}Tree[12];
int loc=0;
Node *create(){
Tree[loc].left=Tree[loc].right=NULL;
return &Tree[loc++];
}
Node *insert(Node *root,int a){
if(root==NULL)
{
root = create();
root->i = a;
return root;
}
else if(ai)root->left=insert(root->left,a);
else if(a>root->i)root->right=insert(root->right,a);
return root;
}
char ch1[10]={'\0',},ch2[10]={'\0',};
char ch1pre[10]={'\0',},ch1in[10]={'\0',},ch2pre[10]={'\0',},ch2in[10]={'\0',};
int count=0;
void preorder1(Node *root){
ch1pre[count++] = root->i+'0';
if(root->left!=NULL)preorder1(root->left);
if(root->right!=NULL)preorder1(root->right);
}
void preorder2(Node *root){
ch2pre[count++] = root->i+'0';
if(root->left!=NULL)preorder2(root->left);
if(root->right!=NULL)preorder2(root->right);
}
void inorder1(Node *root){
if(root->left!=NULL)inorder1(root->left);
ch1in[count++] = root->i+'0';
if(root->right!=NULL)inorder1(root->right);
}
void inorder2(Node *root){
if(root->left!=NULL)inorder2(root->left);
ch2in[count++] = root->i+'0';
if(root->right!=NULL)inorder2(root->right);
}
void clear(char c[]){
for(int i=0;i<10;i++){
c[i]='\0';
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n==0)return 0;
clear(ch1in);
clear(ch1pre);
clear(ch1);
loc=0;
scanf("%s",ch1);
Node *n1=NULL;
for(int i=0;ch1[i]!='\0';i++){
n1 = insert(n1,ch1[i]-'0');
}
count=0;
preorder1(n1);
count=0;
inorder1(n1);
clear(ch2in);
clear(ch2pre);
clear(ch2);
while(n--){
loc=0;
scanf("%s",ch2);
Node *n2= NULL;
for(int j=0;ch2[j]!='\0';j++){
n2 = insert(n2,ch2[j]-'0');
}
count=0;
preorder2(n2);
count=0;
inorder2(n2);
bool b1 = strcmp(ch1pre,ch2pre);
bool b2 = strcmp(ch1in,ch2in);
if((b1==0)&&(b2==0))printf("%s\n","YES");
else printf("%s\n","NO");
}
}
return 0;
}
没完全看明白楼主的思路。刚巧以前写过一个类似的,改了改放在这里,楼主可以参考下,希望能在思路上帮到你。
#include <map>
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;
bool isSameTree(map<size_t,int>& tree, map<size_t, int>& anotherTree);
void buildTree(vector<int>& dataVec, map<size_t, int>& builtTree);
void generateVector(const string& inputs, vector<int>& generatedVec);
int main()
{
const string booleanValueMap[2] = {"NO", "YES"};
vector<bool> results;
int iTreeAmount = 0;
cin >> iTreeAmount;
while(iTreeAmount != 0)
{
string tmpString;
vector<int> tmpVector;
map<size_t, int> originalTree;
cin >> tmpString;
generateVector(tmpString, tmpVector);
buildTree(tmpVector, originalTree);
for(int i=0; i!=iTreeAmount; ++i)
{
cin >> tmpString;
map<size_t, int> newTree;
generateVector(tmpString, tmpVector);
buildTree(tmpVector, newTree);
results.push_back(isSameTree(originalTree, newTree));
}
cin >> iTreeAmount;
}
for(vector<bool>::size_type i=0; i!=results.size();++i)
cout << booleanValueMap[results.at(i)] << endl;
return 0;
}
void buildTree(vector<int>& dataVec, map<size_t, int>& builtTree)
{
builtTree[0] = dataVec[0];
for(vector<int>::size_type i=1;i!=dataVec.size();++i)
{
int iNewNumber = dataVec[i];
size_t ulIndex = 0;
while (builtTree.count(ulIndex))
{
if(iNewNumber > builtTree[ulIndex])
ulIndex = ulIndex * 2 + 2;
else // as there are no identical numbers, it has to be iNewNumber < builtTree[ulIndex] here
ulIndex = ulIndex * 2 + 1;
}
builtTree[ulIndex] = iNewNumber;
}
}
bool isSameTree(map<size_t,int>& oneTree, map<size_t, int>& anotherTree)
{
if(oneTree.size() != anotherTree.size())
return false;
for(map<size_t, int>::iterator itr=oneTree.begin();itr!=oneTree.end();++itr)
{
if(!anotherTree.count(itr->first))
return false;
else if(itr->second != anotherTree[itr->first])
return false;
}
return true;
}
void generateVector(const string& inputs, vector<int>& generatedVec)
{
generatedVec.clear();
for(string::size_type i=0;i!=inputs.size();++i)
{
generatedVec.push_back(inputs.at(i) - '0');
}
}