6-6 判断两棵二叉树是否同构(递归法)

判断两棵二叉树是否同构(递归法)

函数接口定义:

 

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. 左子树和右子树、右子树和左子树之间的同构关系 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值