二叉树分别以数组存储方式创建、以先序遍历序列创建。输入二叉树的数组存储、先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树。
输入:
测试次数t
每组测试数据两行:
第一行:二叉树的数组存储(英文字母表示树结点,#表示空树)
第二行:二叉树的先序遍历结果(英文字母表示树结点,#表示空树)
输出
对每组测试数据,如果两种方式创建的是同一棵二叉树,输出YES,否则,输出NO。
输入样例1:
3
ABCDE
ABD##E##C##
ABC##DE####W##F
AB##CDW###E#F##
abc##d
ab##c#d
输出样例1:
YES
YES
NO
#include <iostream>
#include<queue>
using namespace std;
class bitnode
{
public:
char data;
bitnode* left; //左孩子
bitnode* right; //右孩子
};
class tree
{
public:
bitnode* root;
string a; //数组存储
string b; //先序遍历
int len; //存数组的长度
tree() //创建树
{
cin>>a>>b;
len=a.length();
}
int i=-1;
void preoder(bitnode* &p) //把b还原成树
{
if(i==b.length())
{
return;
}
i++;
if (b[i]!='#') //不为空树
{
p=new bitnode;
p->data=b[i];
preoder(p->left); //递归(先序)
preoder(p->right);
}
else //空树
{
p=new bitnode;
p->data='#';
//没有孩子
p->left=NULL;
p->right=NULL;
}
}
//层次比较
void compa()
{
bitnode*p;
queue<bitnode*>st; //结点队列
st.push(root); //根入队
for(int j=0;j<len;j++)
{
p=st.front(); //取队头
st.pop(); //弹出
//如果p不为空
if(p!=NULL)
{
//一一比较,如果不一样则可判断不是同一棵树
if(p->data!=a[j])
{
cout<<"NO"<<endl;
return;
}
//左右孩子入队
st.push(p->left);
st.push(p->right);
}
}
cout<<"YES"<<endl;
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
tree mytree;
mytree.preoder(mytree.root);
mytree.compa();
}
}