PTA浙江大学数据结构习题——第三周

PTA浙江大学数据结构习题——第三周,第1张

第三周

树的同构

#include 
#include 

using namespace std;

const int N = 15;

struct TreeNode
{
    char e;
    int left, right;
} T1[N], T2[N];

bool st[N];

int BuildTree(struct TreeNode t[])
{
    int n;
    cin >> n;
    memset(st, false, sizeof st);
    
    char a, b, c;
    for (int i = 0; i < n; i ++)
    {
        cin >> a >> b >> c;
        t[i].e = a;
        if (b != '-')
        {
            t[i].left = b - '0';
            st[b - '0'] = true;
        }
        else    t[i].left = -1;
        
        if (c != '-')   
        {
            t[i].right = c - '0';
            st[c - '0'] = true;
        }
        else    t[i].right = -1;
    }
    
    // 寻根
    int root = -1;
    for (int i = 0; i < n; i ++)
        if (!st[i])
        {
            root = i;
            break;
        }
    return root;
}

bool check(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].e != T2[r2].e)   return false;       // 两个节点不相同
    
    if ((T1[r1].left == -1) && (T2[r2].left == -1)) return check(T1[r1].right, T2[r2].right);   // 两个节点的左子树都为空
    
    if ((T1[r1].left != -1) && (T2[r2].left != -1) && (T1[T1[r1].left].e == T2[T2[r2].left].e)) // 两个节点的左子树相同
        return check(T1[r1].left, T2[r2].left) && check(T1[r1].right, T2[r2].right);
    else    return check(T1[r1].left, T2[r2].right) && check(T1[r1].right, T2[r2].left);        // 检查两个节点的左右子树是否交换过
}

int main()
{
    int r1, r2;     // 两棵树的根节点
    r1 = BuildTree(T1), r2 = BuildTree(T2);
    
    if (check(r1, r2))  puts("Yes");
    else    puts("No");
    
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/578809.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存