描述: | 判断两序列是否为同一二叉搜索树序列 |
题目类别: | 树 |
难度: | 中级 |
运行时间限制: | 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 <stdio.h>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
typedef struct Node
{
char data;
struct Node* lchild;
struct Node* rchild;
/*构造函数*/
Node(char d):data(d),lchild(NULL),rchild(NULL)
{
}
}NODE;
void InsertBiTreeNode(NODE* &root, char val)
{
NODE* pNewNode = new NODE(val);
/*如果是一个空树*/
if(root == NULL)
{
root = pNewNode;
return;
}
NODE* p = root, *pre = NULL;
/*找到插入的节点*/
while(p)
{
pre = p;
if(p->data < val)
{
p = p->rchild;
}
else
{
p = p->lchild;
}
}
/*将该节点插入*/
if(pre->data > val)
{
pre->lchild = pNewNode;
}
else
{
pre->rchild = pNewNode;
}
return;
}
/*构建线索二叉树*/
NODE* createBiTree(string str)
{
int i = 0, lens = str.size();
NODE* root = NULL;
for(i = 0; i < lens; i++)
{
InsertBiTreeNode(root,str[i]);
}
return root;
}
/*前序遍历二叉树*/
void preTree(NODE* root, string &ret)
{
if(root == NULL)
{
return;
}
ret += root->data;
preTree(root->lchild,ret);
preTree(root->rchild,ret);
}
int main()
{
int n = 0;
while(cin >> n && n != 0)
{
string str,ret1;
NODE* root1 = NULL;
cin >> str;
root1 = createBiTree(str);
preTree(root1,ret1);
while(n--)
{
cin >> str;
NODE* pTree = NULL;
pTree = createBiTree(str);
string ret2;
preTree(pTree,ret2);
if(ret1 == ret2)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
}
return 0;
}