这道题我依然采用STL库的map,从而大幅减少了代码量
简单说一下思路,两棵树是否同构,只需比较俩树字母相同的结点是否同构,即是否左==左,右==右或者左==右,右==左。

1、条件准备

atree和btree是存两个数结点字母,第几个就存输入的第几个结点的字母。
map通过结点的字母作为键,从而找到两个子节点的信息
都要用char类型
#include <iostream>
#include <map>
using namespace std;

char atree[15], btree[15];
map<char, pair<char, char>> ma, mb;
主函数先是加快cin,cout
然后初始化两棵树,并保存结点个数,然后用solve函数进行处理

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int num;
    num = init(atree, ma);
    num = init(btree, mb);
    solve(num);

    return 0;
}

2、init函数

参数传递为要初始化的树的char数组和map,然后输入结点数。
循环输入第i个结点字母和其两子树的下标。
输入完后我们要把子树的下标转换成对应字母,
遍历结点数组,如果子节点不为‘-',则更新,将存的数字下标转为结点字母
int init(char *tree, map<char, pair<char, char>> &m)
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> tree[i];
        cin >> m[tree[i]].first >> m[tree[i]].second;
    }
    for (int i = 0; i < n; i++)
    {
        if (m[tree[i]].first != '-')
        {
            m[tree[i]].first = tree[m[tree[i]].first - '0'];
        }
        if (m[tree[i]].second != '-')
        {
            m[tree[i]].second = tree[m[tree[i]].second - '0'];
        }
    }
    return n;
}

3、judge函数

judge函数用来判断该节点俩树是否同构。
即左==左,右==右或者左==右,右==左。
bool judge(char c)
{
    if (ma[c].first == mb[c].first && ma[c].second == mb[c].second)
        return 1;
    if (ma[c].first == mb[c].second && ma[c].second == mb[c].first)
        return 1;
    return 0;
}

4、solve函数

遍历其中一棵树的结点,判断是否同构,不同构则输出No,
如果所有结点同构则输出Yes
void solve(int n)
{
    for (int i = 0; i < n; i++)
    {
        if (!judge(atree[i]))
        {
            cout << "No";
            return;
        }
    }
    cout << "Yes";
}

5、总结

这道题使用了map来减少了代码量,其实这一部分也可以用数组实现,因为树中的结点字母不重复,用字母的ACSII码作为下标也可以存储子树。
完整代码如下:
#include <iostream>
#include <map>
using namespace std;

char atree[15], btree[15];
map<char, pair<char, char>> ma, mb;

int init(char *tree, map<char, pair<char, char>> &m)
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> tree[i];
        cin >> m[tree[i]].first >> m[tree[i]].second;
    }
    for (int i = 0; i < n; i++)
    {
        if (m[tree[i]].first != '-')
        {
            m[tree[i]].first = tree[m[tree[i]].first - '0'];
        }
        if (m[tree[i]].second != '-')
        {
            m[tree[i]].second = tree[m[tree[i]].second - '0'];
        }
    }
    return n;
}

bool judge(char c)
{
    if (ma[c].first == mb[c].first && ma[c].second == mb[c].second)
        return 1;
    if (ma[c].first == mb[c].second && ma[c].second == mb[c].first)
        return 1;
    return 0;
}
void solve(int n)
{
    for (int i = 0; i < n; i++)
    {
        if (!judge(atree[i]))
        {
            cout << "No";
            return;
        }
    }
    cout << "Yes";
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int num;
    num = init(atree, ma);
    num = init(btree, mb);
    solve(num);

    return 0;
}

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐