03-树1 树的同构

来源:互联网 发布:淘宝技术排查异常订单 编辑:程序博客网 时间:2024/06/05 02:44

笔记:

#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];        //检查根节点,0为没有父节点,既是根节点    if(N){        for(int i=0;i<N;i++)            check[i] = 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';    //输入字符转为数字                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
原创粉丝点击