03-树1 树的同构(25 分)

#include<bits/stdc++.h>
using namespace std;
struct node{
 char a;
 int right;
 int left;
}T1[10],T2[10];
int buid(node T[]);
int is(int r1,int r2);
int main()
{
    int r1,r2;
    r1=buid(T1);
    r2=buid(T2);
    if(is(r1,r2))
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    return 0;
}
int buid(node T[])//找到树根
{
    int N;
    cin>>N;
    char L,R;
    int root=-1;//把root的初始值设置为-1
    int check[1000]={0};
    if(N)
    {
        for(int i=0;i<N;i++)
        {
             cin>>T[i].a>>L>>R;
            if(L!='-')
            {
                 T[i].left=L-'0';
                 check[T[i].left]=1;
            }
            else
                T[i].left=-1;
            if(R!='-')
            {
                 T[i].right=R-'0';
                 check[T[i].right]=1;
            }
            else
                T[i].right=-1;
        }
    for(int i=0;i<N;i++)
        if(!check[i])
        {
            root=i;
            break;
        }

    }
    return root;
}
int is(int r1,int r2)//以树根来开始判断
{
    if((r1==-1)&&(r2==-1))//都没有树根,对应了root的初始值-1
        return 1;
    if(((r1==-1)&&(r2!=-1))||((r1!=-1)&&(r2==-1)))
        return 0;
    if(T1[r1].a!=T2[r2].a)
        return 0;
    if((T1[r1].left==-1)&&(T2[r2].left==-1))
        return is(T1[r1].right,T2[r2].right);
    if(((T1[r1].left!=-1)&&(T2[r2].left!=-1))&&((T1[T1[r1].left].a)==(T2[T2[r2].left].a)))//左左判断,右右判断
        return (is(T1[r1].left,T2[r2].left)&&is(T1[r1].right,T2[r2].right));
    else//左右判断
        return (is(T1[r1].left,T2[r2].right)&&is(T1[r1].right,T2[r2].left));
}

静态链表的应用

注意逻辑关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值