描述
设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,按此方法创建两棵二叉树,然后编写递归算法判断这两棵树是否相等。
输入
多组数据,每组数据有两行。每行为一个二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。
输出
每组数据输出一行。若两个二叉树相等输出“YES”,否则输出“NO”。
输入样例 1
abcd00e00f00ig00h00
abcd00e00f00ig00h00
abd00e00cf00g00
abd00e00cf00h00
0
输出样例 1
YES
NO
//基于二叉链表的树结构相等的判断
#include <iostream>
using namespace std;
typedef struct LNode{
char data; //存储这个结点的数据
LNode *lchild; //结点的左子结点
LNode *rchild; //结点的右子结点
LNode *parent; //结点的父结点
}LNode,*Tree;
void GetTree(Tree &tree,string::iterator &it){ //递归创建树
if(*it=='0'){ //如果读取到0 直接返回 iterator往后走
it++;
return;
}
tree->data=*it; //(此时it必没有读到0) 赋值
it++; //it往后走
if(*it!='0'){tree->lchild=new LNode;tree->lchild->lchild=tree->lchild->rchild=tree->lchild->parent=NULL;} //如果it不是0就创建左子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题
GetTree(tree->lchild,it);//对左子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序
if(*it!='0'){tree->rchild=new LNode;tree->rchild->lchild=tree->rchild->rchild=tree->rchild->parent=NULL;} //如果it不是0就创建右子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题
GetTree(tree->rchild,it);//对右子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序
}
int Compare(Tree treea,Tree treeb){ //对比两棵树 利用递归 如果存在一个0就一直往前传递 没有的话就最终传递回1
if(treea->data!=treeb->data) return 0;
if((treea->lchild&&!treeb->lchild)||(treea->rchild&&!treeb->rchild)||(treeb->lchild&&!treea->lchild)||(treeb->rchild&&!treea->rchild)) return 0; //如果有一棵树的左/右子树存在但是另一棵树不存在
if(treea->lchild&&treeb->lchild)
if(Compare(treea->lchild,treeb->lchild)==0) return 0;
if(treea->rchild&&treeb->rchild)
if(Compare(treea->rchild,treeb->rchild)==0) return 0;
return 1;
}
void OutTree(Tree &tree){ //输出树
cout<<tree->data; //输出数据
if(tree->lchild) OutTree(tree->lchild); //输出左子树
if(tree->rchild) OutTree(tree->rchild); //输出右子树
}
void Calculate(string str){
Tree treea=new LNode,treeb=new LNode;
std::string::iterator it=str.begin();
GetTree(treea,it); //创造a树
string str2;
cin>>str2;
std::string::iterator ite=str2.begin();
GetTree(treeb,ite); //创造b树
if(Compare(treea,treeb)==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main(){
string str; //一行数据
while(cin>>str&&str!="0") //输入一行数据到只有零为止
Calculate(str);
return 0;
}