入力:2つの文字列を入力し、0〜9の各数値に注意してください。
アイデア:ツリーが構築された後、2つのツリーのプレオーダートラバーサル+ミドルオーダートラバーサル、プレオーダートラバーサルの結果は同じであり、中次走査の結果は同じであり、同じ2つのフォーク検索ツリー
コードを示しています。
//判断两序列是否为同一二叉搜索树序列 、
//输入字符串,每个数字0~9
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct TreeNode{
int data;
TreeNode* leftChild;
TreeNode* rightChild;
TreeNode(int x):data(x),leftChild(NULL),rightChild(NULL){
}
};
TreeNode* insert(TreeNode *root,int number)
{
if(root==NULL) root=new TreeNode(number);
else if(number>root->data){
root->rightChild=insert(root->rightChild,number);
}
else{
root->leftChild=insert(root->leftChild,number);
}
return root;
}
void PreOrder(TreeNode*root,vector<int>&a)
{
if(root==NULL) return;
a.push_back(root->data);
PreOrder(root->leftChild,a);
PreOrder(root->rightChild,a);
return;
}
void InOrder(TreeNode*root,vector<int>&a)
{
if(root==NULL) return;
PreOrder(root->leftChild,a);
a.push_back(root->data);
PreOrder(root->rightChild,a);
return;
}
int main()
{
string str1;string str2;
cin>>str1>>str2;
if(str1.size()!=str2.size()) {
cout<<"NO"<<endl;
return 0;
}
TreeNode*root1=NULL;
TreeNode*root2=NULL;
for(int i=0;i<str1.size();++i)
{
int n1=str1[i]-'0';
int n2=str2[i]-'0';
root1=insert(root1,n1);
root2=insert(root2,n2);
}
vector<int>a1;vector<int>a2;
PreOrder(root1,a1);
PreOrder(root2,a2);
vector<int>a3;vector<int>a4;
InOrder(root1,a3);
InOrder(root2,a4);
if(a1==a2&&a3==a4) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}