5-3 树的同构

来源:互联网 发布:淘宝网卫裤 编辑:程序博客网 时间:2024/06/15 23:56

点击打开链接

首先肯定是通过题目的输入来构造出两棵树,然后我们就对第一棵树中每一个结点来找出第二棵树中的对应结点,然后判断它们的孩子结点元素是否是一样的。两棵树中包含的结点个数和元素必须相同的,而对于第一棵树的每一个结点呢,在第一棵树我们都能找到一个与之对应的结点,并且它们的左右孩子结点的元素是相同的话,当然左右可以互换,这样的两棵树就是同构的。 

#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;#define null -1struct TreeNode{    char Element;    int right,left;}T1[100],T2[100];int Buildtree(struct TreeNode T[]){    int n,chick[100],root;    char  left,right;    cin>>n;    if(n)    {        for(int i=0;i<n;i++)            chick[i]=0;        for(int i=0;i<n;i++)        {            cin>>T[i].Element>>left>>right;            if(left != '-')            {                T[i].left=left-'0';                chick[T[i].left]=1;            }            else                T[i].left=-1;            if(right != '-')            {                T[i].right=right-'0';                chick[T[i].right]=1;            }            else                T[i].right=-1;        }        for(int i=0;i<n;i++)        {            if(chick[i]==0)            {                root=i;                break;            }        }    }    else        root=-1;    return root;}int isomorphic (int  r1,int  r2){    if(r1==null && r2==null)        return 1;    if((r1==null &&r2!=null)||(r1!=null&&r2==null))        return 0;    if(T1[r1].Element != T2[r2].Element)        return 0;    if(T1[r1].left==null&&T2[r2].left==null)        return isomorphic(T1[r1].right,T2[r2].right);    if((T1[r1].left!=null && T2[r2].left!=null) && (T1[T1[r1].left].Element==T2[T2[r2].left].Element))        return (isomorphic(T1[r1].left,T2[r2].left) && isomorphic(T1[r1].right,T2[r2].right) );    else        return (isomorphic(T1[r1].left,T2[r2].right) && isomorphic(T1[r1].right,T2[r2].left) );}int main(){    int root1,root2;    root1=Buildtree(T1);    root2=Buildtree(T2);    if(isomorphic(root1,root2)==0)        cout<<"No";    else        cout<<"Yes";}