树的同构

时间:2019-08-28
本文章向大家介绍树的同构,主要包括树的同构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  • 题目描述
  • C语言实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define MaxSize 100

typedef char ElementType;

struct TNode
{
    ElementType Elem;
    int Left;
    int Right;
}T1[MaxSize],T2[MaxSize];

int BuildeTree(struct TNode T[])
{
    int N;
    int Root = -1;
    int i = 0;
    char cl, cr;
    int check[MaxSize];
    scanf("%d\n",&N);
    if (N != 0)
    {
        for (i = 0;i < N;i++)
        {
            check[i] = 0;
        }
        for (i = 0;i < N;i++)
        {
            scanf("%c %c %c\n",&T[i].Elem,&cl,&cr);
            if (cl != '-')
            {
                T[i].Left = cl - '0';
                check[T[i].Left] = 1;
            }
            else
            {
                T[i].Left = -1;  //-1表示没有子节点
            }
            if (cr != '-')
            {
                T[i].Right = cr - '0';
                check[T[i].Right] = 1;
            }
            else
            {
                T[i].Right = -1;  //-1表示没有子节点
            }
        }
        for (i = 0; i < N;i++)
        {
            if (!check[i])
            {
                Root = i;
                break;
            }
        }
    }
    return Root;
}

bool Isomorphism(int R1,int R2)
{
    //先对基本情况进行判断
    if (R1 == -1 && R2 == -1)
    {
        return true;  //两颗树都是空树,一定同构
    }
    if ((R1 == -1 && R2 != -1)
        ||(R1 != -1 && R2 == -1))
    {
        return false;  //一颗为空树 另一个颗不是空树 一定不同构
    }
    if (T1[R1].Elem != T2[R2].Elem)
    {
        return false;  //两颗树的根节点不相同 必定不同构
    }
    if (T1[R1].Left == -1 && T2[R2].Left == -1)
    {
        Isomorphism(T1[R1].Right, T2[R2].Right);  //左子树为空 则判断其右子树
    }
    if ((T1[R1].Left != -1 && T2[R2].Left != -1) &&
        (T1[T1[R1].Left].Elem == T2[T2[R2].Left].Elem))
    {
        //不用交换左右子树
        return (Isomorphism(T1[R1].Left,T2[R2].Left) && Isomorphism(T1[R1].Right, T2[R2].Right));
    }
    else
    {
        //需要交换左右子树
        return (Isomorphism(T1[R1].Left, T2[R2].Right) && Isomorphism(T1[R1].Right, T2[R2].Left));
    }
}

int main()
{
    int R1, R2;
    R1 = BuildeTree(T1);
    R2 = BuildeTree(T2);
    if (Isomorphism(R1,R2))
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }
    // system("pause");
    return 0;
}

值得一提的是,这道题目也是用递归的思想来解决。

原文地址:https://www.cnblogs.com/Manual-Linux/p/11425124.html