问题 C: 同一棵二叉树?(二叉树)
时间限制: 1 Sec 内存限制: 128 MB
提交: 74 解决: 57
[提交][状态][讨论版]
题目描述
二叉树分别以数组存储方式创建、以先序遍历序列创建。输入二叉树的数组存储、先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树。
输入
测试次数t
每组测试数据两行:
第一行:二叉树的数组存储(英文字母表示树结点,#表示空树)
第二行:二叉树的先序遍历结果(英文字母表示树结点,#表示空树)
输出
对每组测试数据,如果两种方式创建的是同一棵二叉树,输出YES,否则,输出NO。
样例输入
3
ABCDE
ABD##E##C
ABC##DE####W##F
AB##CDW###E#F##
abc##d
ab##c#d
样例输出
YES
YES
NO
#include<iostream>
#include<string>
using namespace std;
class BitreeNode
{
public:
char data;
BitreeNode *left;
BitreeNode *right;
BitreeNode()
{
left=right=NULL;
}
};
class Bitree
{
public:
int pos;
BitreeNode *Root;
string strtree;
string strpre;
string strin;
Bitree(string str)
{
strpre="";
strin="";
pos=0;
strtree=str;
Root=CreateBitree();
}
BitreeNode *CreateBitree()
{
char ch=strtree[pos];
pos++;
if(ch=='#')
return NULL;
else
{
BitreeNode *T=new BitreeNode();
T->data=ch;
T->left=CreateBitree();
T->right=CreateBitree();
return T;
}
}
void preorder(BitreeNode *T)
{
if(T!=NULL)
{
strpre+=T->data;
preorder(T->left);
preorder(T->right);
}
return;
}
void inorder(BitreeNode *T)
{
if(T!=NULL)
{
inorder(T->left);
strin+=T->data;
inorder(T->right);
}
return;
}
};
class Martree
{
public:
char *Tree;
int number;
string strpre;
string strin;
Martree(string str)
{
strpre="";
strin="";
number=(int)str.size();
Tree=new char[number];
for(int i=0;i<number;i++)
Tree[i]=str[i];
}
void preorder(int i)
{
if(i<number)
{
if(Tree[i]!='#')
{
strpre+=Tree[i];
preorder(2*i+1);
preorder(2*i+2);
}
}
return;
}
void inorder(int i)
{
if(i<number)
{
if(Tree[i]!='#')
{
inorder(2*i+1);
strin+=Tree[i];
inorder(2*i+2);
}
}
return;
}
};
int main()
{
int T;
cin>>T;
while(T--)
{
string str1,str2;
cin>>str1>>str2;
if(str2[str2.size()-1]!='#')
str2+="##";
Martree mTree(str1);
Bitree bTree(str2);
mTree.preorder(0);
mTree.inorder(0);
bTree.preorder(bTree.Root);
bTree.inorder(bTree.Root);
if(mTree.strpre==bTree.strpre&&mTree.strin==bTree.strin)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}