DS二叉树判断–同一棵二叉树?
题目描述
二叉树分别以数组存储方式创建、以先序遍历序列创建。输入二叉树的数组存储、先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树。
输入
测试次数t
每组测试数据两行:
第一行:二叉树的数组存储(英文字母表示树结点,#表示空树)
第二行:二叉树的先序遍历结果(英文字母表示树结点,#表示空树)
输出
测试次数t
每组测试数据两行:
第一行:二叉树的数组存储(英文字母表示树结点,#表示空树)
第二行:二叉树的先序遍历结果(英文字母表示树结点,#表示空树)
输入样例
3
ABCDE
ABD##E##C
ABC##DE####W##F
AB##CDW###E#F##
abc##d
ab##c#d
输出样例
YES
YES
NO
代码
#include<iostream>
using namespace std;
class BiTreeNode {
public:
char data;
BiTreeNode *LeftChild;
BiTreeNode *RightChild;
BiTreeNode():LeftChild(NULL), RightChild(NULL) {}
};
class BiTree {
public:
void CreateTree(string s);
void PreOrder();
void InOrder();
BiTreeNode *Root;
string preTree;
string inTree;
private:
void PreOrder(BiTreeNode *t);
void InOrder(BiTreeNode *t);
BiTreeNode *CreateTree(int pos);
string strTree;
int len;
};
void BiTree::InOrder() {
InOrder(Root);
}
void BiTree::InOrder(BiTreeNode *t) {
if(t)
{
InOrder(t->LeftChild);
inTree += t->data;
InOrder(t->RightChild);
}
}
void BiTree::PreOrder() {
PreOrder(Root);
}
void BiTree::PreOrder(BiTreeNode *t) {
if(t)
{
preTree += t->data;
PreOrder(t->LeftChild);
PreOrder(t->RightChild);
}
}
void BiTree::CreateTree(string s) {
preTree = "";
inTree = "";
len = s.length();
strTree.assign(s);
Root = CreateTree(0);
}
BiTreeNode *BiTree::CreateTree(int pos) {
BiTreeNode *T;
char ch;
if(pos>=len)
return NULL;
ch = strTree[pos];
if(ch=='#')
T = NULL;
else
{
T = new BiTreeNode();
T->data = ch;
T->LeftChild = CreateTree(2*pos+1);
T->RightChild = CreateTree(2*pos+2);
}
return T;
}
class Bittree {
public:
void CreateTree(string s);
void PreOrder();
void InOrder();
BiTreeNode *Root;
string preTree;
string inTree;
private:
void PreOrder(BiTreeNode *t);
void InOrder(BiTreeNode *t);
BiTreeNode *CreateTree();
int pos;
string strTree;
};
void Bittree::InOrder() {
InOrder(Root);
}
void Bittree::InOrder(BiTreeNode *t) {
if(t)
{
InOrder(t->LeftChild);
inTree += t->data;
InOrder(t->RightChild);
}
}
void Bittree::PreOrder() {
PreOrder(Root);
}
void Bittree::PreOrder(BiTreeNode *t) {
if(t)
{
preTree += t->data;
PreOrder(t->LeftChild);
PreOrder(t->RightChild);
}
}
void Bittree::CreateTree(string s) {
pos = 0;
strTree.assign(s);
Root = CreateTree();
}
BiTreeNode * Bittree::CreateTree() {
BiTreeNode *T;
char ch;
ch = strTree[pos++];
if(ch=='#')
T = NULL;
else
{
T = new BiTreeNode();
T->data = ch;
T->LeftChild = CreateTree();
T->RightChild = CreateTree();
}
return T;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
string s1,s2;
cin>>s1>>s2;
BiTree biTree;
biTree.CreateTree(s1);
Bittree bittree;
if(s2[s2.size()-1]!='#')
s2+="##";
bittree.CreateTree(s2);
biTree.InOrder();
biTree.PreOrder();
bittree.InOrder();
bittree.PreOrder();
if(biTree.preTree==bittree.preTree&&biTree.inTree==bittree.inTree)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}