03-树1 树的同构

来源:互联网 发布:python实现自动签到 编辑:程序博客网 时间:2024/06/05 00:12
#include<stdio.h>#define MaxTree 10#define ElementType char#define Tree int#define Null -1struct TreeNode     //结构体数组{    ElementType Element;          Tree Left;            //记录左儿子的下标    Tree Right;           //记录右儿子的下标}T1[MaxTree],T2[MaxTree];//T1,T2为全局变量 Tree BuildTree(struct TreeNode T[]){    int N,Root=-1;    char cl,cr;    scanf("%d\n",&N);    int check[N];      //用来找出输入的序列中哪个是根节点    if(N){        for(int i=0;i<N;i++)            check[i] = 0;          //初始化数组,0代表没有父节点指向他        for(int i=0;i<N;i++){            scanf("%c %c %c\n",&T[i].Element,&cl,&cr);            if(cl != '-'){                T[i].Left = cl - '0';      //读入的字符减去'0'就是数字了                check[T[i].Left] = 1;            }            else                T[i].Left = Null;            if(cr != '-'){                T[i].Right = cr - '0';                check[T[i].Right] = 1;            }            else                T[i].Right = Null;        }        for(int i=0;i<N;i++)        {            if(!check[i]){                Root = i;    //找出根节点                break;            }        }    }    return Root;}int Isomorphic(Tree R1,Tree 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(){    Tree R1,R2;    R1 = BuildTree(T1);    R2 = BuildTree(T2);    if(Isomorphic(R1,R2))        printf("Yes\n");    else        printf("No\n");     return 0;}

0 0
原创粉丝点击