SDUT 3340 数据结构实验之二叉树一:树的同构

点击打开题目链接

点击打开视屏链接:第三讲树,小白专场

#include <bits/stdc++.h>
#define Null -1
using namespace std;

struct Tree
{
    char data;
    int left;
    int right;
} T1[15], T2[15];

int judge(int r1, int r2);
int CreatTree(Tree T[], int n);

int main()
{
    int n;
    int r1, r2;
    while(cin >> n)
    {
        r1 = CreatTree(T1, n);
        cin >> n;
        r2 = CreatTree(T2, n);
        if(judge(r1, r2)) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}

int CreatTree(Tree T[], int n)
{
    int  root = -1;
    char r[10], l[10], data[10];
    int check[15];
    memset(check, 0, sizeof(check));
    if(n)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%s %s %s", data, l, r);
            T[i].data = data[0];
            if(l[0] != '-')
            {
                T[i].left = l[0]-'0';
                check[T[i].left] = 1;
            }
            else T[i].left = Null;
            if(r[0] != '-')
            {
                T[i].right = r[0]-'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 judge(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].data != T2[r2].data)
        return 0;
    if((T1[r1].left == Null) && (T2[r2].left == Null))
        return judge(T1[r1].right,T2[r2].right);
    if((T1[r1].left != Null && T2[r2].left != Null) &&
            (T1[T1[r1].left].data == T2[T2[r2].left].data))
        return (judge(T1[r1].left, T2[r2].left) && judge(T1[r1].right, T2[r2].right));
    else return (judge(T1[r1].left, T2[r2].right) && judge(T1[r1].right, T2[r2].left));
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值