判断两棵二叉树是否同构(递归法)
函数接口定义:
bool Isomorphism(BiTree T1,BiTree T2);
裁判测试程序样例:
#include<iostream> #include<string.h> #define N 100; using namespace std; typedef struct BiNode{ char data; struct BiNode *lchild,*rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree &T,char a[],int &i){ char ch; ch=a[i++]; if(ch=='#') T=NULL; else{ T=new BiTNode; T->data=ch; CreateBiTree(T->lchild,a,i); CreateBiTree(T->rchild,a,i); } } bool Isomorphism(BiTree T1,BiTree T2); int main(){ BiTree T1,T2; int i=0,j=0; char a[N]; char b[N]; cin>>a>>b; CreateBiTree(T1,a,i); CreateBiTree(T2,b,j); cout<<Isomorphism(T1,T2); return 0; } /* 请在这里填写答案 */
输入样例:
输入两行字符序列先序递归构建两棵二叉树。每个字符对应一个树节点,#表示空节点。
ABD#E###CF##G##
HIJ#K###LM##N##
输出样例:
同构输入1,否则输入0。
1
题解:
感觉在PTA上,这道题的测试样例是有错误的,当时学的时候同构二叉树要求结构相同且元素相同,下面是定义:两棵二叉树被称为同构二叉树,当且仅当它们具有相同的结构,即它们的节点位置和连接方式完全相同。换句话说,如果可以通过对其中一个树的节点进行一系列的左右子树交换(或不交换)操作,使得两棵树的节点位置和连接方式完全相同,那么它们就是同构的。
但PTA上只考虑了结构相同,所以我就把判断元素相同的部分注释掉了
bool Isomorphism(BiTree T1, BiTree T2) {
// 如果两个树都为空,认为它们是同构的
if (T1 == NULL && T2 == NULL)
return true;
// 如果只有一个树为空,认为它们不是同构的
if (T1 != NULL && T2 == NULL)
return false;
if (T1 == NULL && T2 != NULL)
return false;
// 根节点的值必须相等
//if (T1->data != T2->data)
// return false;
// 情况1:
bool iso1 = Isomorphism(T1->lchild, T2->lchild) && Isomorphism(T1->rchild, T2->rchild);
// 情况2:
bool iso2 = Isomorphism(T1->lchild, T2->rchild) && Isomorphism(T1->rchild, T2->lchild);
// 只有当两种情况都满足时,才认为是同构的
return iso1 || iso2;
}
值得说明的是判断两种情况:
1. 左子树和左子树、右子树和右子树之间的同构关系
2. 左子树和右子树、右子树和左子树之间的同构关系