描述:
判断两序列是否为同一二叉搜索树序列
题目类别: 树
难度: 中级
运行时间限制: 10Sec
内存限制: 128MByte
阶段: 入职前练习
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:
如果序列相同则输出YES,否则输出NO
样例输入:
2
567432
543267
576342
0
样例输出:
YES
判断两序列是否为同一二叉搜索树序列
题目类别: 树
难度: 中级
运行时间限制: 10Sec
内存限制: 128MByte
阶段: 入职前练习
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:
如果序列相同则输出YES,否则输出NO
样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
#include <iostream>
#include <string>
using namespace std;
int original_tree[1024] = {0}; //顺序存储结构,存储建立的原始序列二叉搜索树
int judge_tree[1024] = {0}; //顺序存储结构,存储建立的判断序列二叉搜索树
void creatSortTree(int *address,char ch,int index) //建立二叉搜索树序列
{
if(address[index] == 0) //新节点存放
{
address[index] = ch;
return ;
}
if(address[index] > ch) //递归找到还未存储的节点
{
creatSortTree(address,ch,index<<1);
}
else
{
creatSortTree(address,ch,index*2+1);
}
}
int main()
{
int i = 0;
int j = 0;
int line_num = 0;
string original_serial = "";
string judge_serial = "";
bool flag = true;
cin>>line_num;
while(line_num)
{
memset(original_tree,0,1024);
cin>>original_serial;
for(i = 0; i < original_serial.size(); ++i) //建立原始二叉搜索树
{
creatSortTree(original_tree,original_serial[i],1);
}
for(j = 0; j <line_num; ++j)
{
flag = true;
memset(judge_tree,0,1024);
cin>>judge_serial;
for(i = 0; i < judge_serial.size(); ++i) //建立判断二叉搜索树
{
creatSortTree(judge_tree,judge_serial[i],1);
}
for(i = 0 ;i < 1024; ++i)
{
if(original_tree[i] != judge_tree[i]) //判断两个序列是否能组成同一颗二叉搜索树
{
flag = false;
break;
}
}
if(flag)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
cin>>line_num;
}
}