题目:https://cn.vjudge.net/problem/HDU-3791
题意:中文题干不再赘述
思路:根据输入建二叉搜索树,若前序和中序遍历的结果相同则必定是同一棵二叉树。
代码:C++
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <stack>
using namespace std;
struct Node
{
Node *left;
Node *right;
int val;
Node(int val = 0): val(val), left(NULL), right(NULL) {}
};
struct Tree
{
vector<int> inorder, preorder;
Node *root;
Tree(): root(NULL) {}
void build(string &s)
{
for(int i = 0; i < s.size(); i++)
{
insert(s[i] - '0');
}
dfs(root);
}
void insert(int v)
{
if(root == NULL)
{
root = new Node(v);
return;
}
Node *cur = root;
while(true)
{
if(v < cur->val)
{
if(cur->left == NULL)
{
cur->left = new Node(v);
break;
}
cur = cur->left;
}
else if(v > cur->val)
{
if(cur->right == NULL)
{
cur->right = new Node(v);
break;
}
cur = cur->right;
}
}
}
void dfs(Node *cur)
{
preorder.push_back(cur->val);
if(cur->left)
{
dfs(cur->left);
}
inorder.push_back(cur->val);
if(cur->right)
{
dfs(cur->right);
}
}
bool operator == (const Tree &t) const
{
return inorder == t.inorder && preorder == t.preorder;
}
void clear(Node *cur)
{
if(cur->left)
{
clear(cur->left);
}
if(cur->right)
{
clear(cur->right);
}
delete cur;
}
~Tree()
{
clear(root);
}
};
int main()
{
int n;
while(cin >> n && n)
{
string s;
cin >> s;
Tree ori;
ori.build(s);
for(int i = 0; i < n; i++)
{
cin >> s;
Tree t;
t.build(s);
printf("%s\n", ori == t ? "YES" : "NO");
}
}
return 0;
}