输入一个整数n,再给你一个序列s让你生成一个二叉排序树,接下来输入n个序列,判断这n个序列生成的二叉排序树是否和序列s生成的二叉排序树相同。
这道题的思路是这样,我们首先应该根据给定序列建一个二叉排序树,判断两颗树相同的条件是它们的前序序列和中序序列/后序序列和中序序列相等。
下面是此题的代码:
#include <iostream>
#include <string>
using namespace std;
struct Node
{
Node *lchild;
Node *rchild;
char c;
};
string store_pre[21]; //设着全局变量来存储前序和中序遍历的结果
string store_in[21];
void preOrder(Node *T,int i) //前序遍历
{
store_pre[i] += T->c;
if (T -> lchild != NULL)
{
preOrder(T->lchild,i);
}
if (T -> rchild != NULL)
{
preOrder(T->rchild,i);
}
}
void inOrder(Node *T,int i) //中序遍历
{
if (T -> lchild != NULL)
{
inOrder(T->lchild,i);
}
store_in[i] += T->c;
if (T -> rchild != NULL)
{
inOrder(T->rchild,i);
}
}
Node Tree[200]; //结构体数组,用来存放结点
int local; //全局变量,用来记录当前已申请的结点数
Node* creat() //用来申请结点空间
{
Tree[local].lchild = Tree[local].rchild = NULL;
local++;
return &Tree[local-1];
}
Node* insert(Node *T,char x) //将输入的数字插入二叉排序树
{
if (T == NULL)
{
T = creat();
T -> c = x;
return T;
}
else if (x < T->c)
{
T->lchild = insert(T->lchild,x);
}
else if (x > T->c)
{
T->rchild = insert(T->rchild,x);
}
return T;
}
int main()
{
int n;
while (cin >> n)
{
if (n == 0) break;
local = 0;
Node *T;
string str[21]; //字符串数组,用来保存输入
for(int i = 0;i < 21;i++) //对存储结果的全局变量进行初始化
{
store_in[i].clear();
store_pre[i].clear();
}
for (int i = 0;i <=n;i++) //输入
{
cin >> str[i];
}
for (int i = 0;i <= n;i++) //对每个输入字符串建树后,进行前序和中序遍历
{
T = NULL;
for (int j = 0;j < str[i].size();j++)
{
T = insert(T,str[i][j]);
}
preOrder(T,i);
inOrder(T,i);
}
store_pre[0] += store_in[0];
for (int i = 1;i <=n;i++) //遍历结果与给定的字符串的遍历结果进行比较
{
store_pre[i] += store_in[i];
if (store_pre[i] == store_pre[0])
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
}
return 0;
}