03-树1 树的同构 (25分)

来源:互联网 发布:显示器颜色调整软件 编辑:程序博客网 时间:2024/06/04 17:41

AC代码 (根据课件整理)

#include<iostream>using namespace std;#define Null -1struct node{    char V;    int L,R;}T1[10],T2[10];// 静态链表int build(node T[]){    int n;    char c1,c2;    cin>>n;    if(n==0)        return Null;    int visited[10]={0};// 用来寻找根节点    for(int i=0; i<n; i++)    {        cin>>T[i].V>>c1>>c2;        if(c1=='-')            T[i].L=Null;        else{            T[i].L=c1-'0';            visited[T[i].L]=1;// 该节点i被指向了        }        if(c2=='-')            T[i].R=Null;        else{            T[i].R=c2-'0';            visited[T[i].R]=1;// 该节点i被指向了        }    }    for(int i=0; i<n; i++)        if(visited[i]==0)//未被指向的即根节点           return i;}bool isomorphism(int r1,int r2){    if(r1==Null&&r2==Null)// 两棵树都是空树        return true;    if((r1==Null&&r2!=Null)||(r1!=Null&&r2==Null))// 一棵树空一棵树不空        return false;    if(T1[r1].V!=T2[r2].V)// 树节点值value不相等        return false;    if(T1[r1].L==Null&&T2[r2].L==Null)// 两者左子树皆空 转而判断右子树        return isomorphism(T1[r1].R,T2[r2].R);    if(T1[r1].L!=Null&&T2[r2].L!=Null &&       T1[T1[r1].L].V==T2[T2[r2].L].V)// 两者左子树皆不空 并且左子树的值相等        return (isomorphism(T1[r1].L,T2[r2].L)&&                isomorphism(T1[r1].R,T2[r2].R));// 转而二路递归判断两者的子树    else        return (isomorphism(T1[r1].L,T2[r2].R)&&                isomorphism(T1[r1].R,T2[r2].L));// 两者左子树有一个空 或 皆不空但值不相等 则交换左右子树再判断}int main(){    int R1,R2;    R1=build(T1);    R2=build(T2);    if(isomorphism(R1,R2))        cout<<"Yes"<<endl;    else        cout<<"No"<<endl;    return 0;}


2 0
原创粉丝点击