首页 > 其他分享 >7-3 树的同构 (25分)

7-3 树的同构 (25分)

时间:2023-05-30 16:35:27浏览次数:64  
标签:25 同构 right int father t1 str left


7-3 树的同构 (25分)

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

图1

7-3 树的同构 (25分)_结点

图2

7-3 树的同构 (25分)_#include_02

现给定两棵树,请你判断它们是否是同构的。

输入格式:

输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。
输出格式:

如果两棵树是同构的,输出“Yes”,否则输出“No”。
输入样例1(对应图1):

8
A 1 2
B 3 4
C 5 -
D - -
E 6 -
G 7 -
F - -
H - -
8
G - 4
B 7 6
F - -
A 5 1
H - -
C 0 -
D - -
E 2 -

输出样例1:

Yes

输入样例2(对应图2):

8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4

输出样例2:

No

//
// Created by TIGA_HUANG on 2020/9/24.
//

#include <iostream>
#include <sstream>

using namespace std;

struct node {
    string data;
    int left;
    int right;
    int father;
} a[20], b[20];

int s2i(string &str) {
    int ret;
    stringstream ss;
    ss << str;
    ss >> ret;
    return ret;
}

bool dfs(int t1, int t2) {
    if (t1 == -1 && t2 == -1)
        return true;
    if (t1 == -1 || t2 == -1)
        return false;
    if (a[t1].data == b[t2].data) {
        if (a[t1].left == -1 && b[t2].left == -1)
            return dfs(a[t1].right, b[t2].right);
        else if (a[t1].right == -1 && b[t2].right == -1)
            return dfs(a[t1].left, b[t2].left);
        if (a[t1].right != -1 && b[t1].right != -1 && a[a[t1].left].data == a[b[t2].left].data)
            return dfs(a[t1].left, b[t2].left) && dfs(a[t1].right, b[t2].right);
        else
            return dfs(a[t1].left, b[t2].right) && dfs(a[t1].right, b[t2].left);
    } else
        return false;
}

void checkA(int t) {
    if (t == -1)
        return;
    cout << a[t].data << ' ';
    if (a[t].left != -1)
        checkA(a[t].left);
    if (a[t].right != -1)
        checkA(a[t].right);
}

void checkB(int t) {
    if (t == -1)
        return;
    cout << b[t].data << ' ';
    if (b[t].left != -1)
        checkB(b[t].left);
    if (b[t].right != -1)
        checkB(b[t].right);
}

int main() {
    int N;
    cin >> N;
    string data, left_str, right_str;
    int left, right, root_a = -1, root_b = -1;
    for (int i = 0; i < N; ++i) {
        a[i].father = -1;
    }
    for (int i = 0; i < N; ++i) {
        cin >> data >> left_str >> right_str;
        if (left_str == "-")
            left = -1;
        else
            left = s2i(left_str);
        if (right_str == "-")
            right = -1;
        else
            right = s2i(right_str);
        a[i] = {data, left, right, a[i].father};
        if (left != -1)
            a[left].father = i;
        if (right != -1)
            a[right].father = i;
    }
    for (int i = 0; i < N; ++i) {
        if (a[i].father == -1) {
            root_a = i;
            break;
        }
    }
    cin >> N;
    for (int i = 0; i < N; ++i) {
        b[i].father = -1;
    }
    for (int i = 0; i < N; ++i) {
        cin >> data >> left_str >> right_str;
        if (left_str == "-")
            left = -1;
        else
            left = s2i(left_str);
        if (right_str == "-")
            right = -1;
        else
            right = s2i(right_str);
        b[i] = {data, left, right, b[i].father};
        b[left].father = i;
        b[right].father = i;
        if (left != -1)
            b[left].father = i;
        if (right != -1)
            b[right].father = i;
    }
    for (int i = 0; i < N; ++i) {
        if (b[i].father == -1) {
            root_b = i;
            break;
        }
    }
//    checkB(root_b);
//    cout << endl;
//    cout << root_a << ' ' << root_b;
    if (dfs(root_a, root_b))
        cout << "Yes\n";
    else
        cout << "No\n";
    return 0;
}


标签:25,同构,right,int,father,t1,str,left
From: https://blog.51cto.com/u_16144724/6380358

相关文章

  • 堆栈模拟队列 (25分)
    堆栈模拟队列(25分)设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:intIsFull(StackS):判断堆栈S是否已满,返回1或0;intIsEmpty(StackS):判断堆栈S是否为空,返回1或0;voidPush(StackS,ElementTypeitem):将......
  • hmac(md5,sha256) 魔改算法逆向
    2bebb2b85345bac93a790d1a6986b3d5经验1貌似特征码,需要在从伪代码切换到汇编模式,再点击看具体值2找出特征码,然后google再带算法,再带csource如md50x242070DBcsource3md5和sha1在transfrom4个特征相同,sha1多两个重命名经验根据上下文关系,需要点进去发现特征量,验......
  • 关于vi编辑出现E325: ATTENTION的解决方案
    解决方案 1-vifilename进入编辑器,查看报错信息,出现E325:ATTENTION例如:E325:ATTENTIONFoundaswapfilebythename"rm/var/opt/gitlab/gitlab-rails/etc/.gitlab.yml.swp"2-复制Foundaswapfilebythename之后的信息,并退出......
  • 代码随想录算法训练营第17天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404
     第六章二叉树part04 今日内容:  ●  110.平衡二叉树 ●  257. 二叉树的所有路径 ●  404.左叶子之和   详细布置  迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  110.平衡二叉树 (优先掌握递归) 再一次涉及到,什么是高度,什么是......
  • 文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题
    七、设计算法,仅使用三次实数乘法即可完成复数a+bi和c+di相乘。算法需接收a、b、c和d为输入,分别生成实部ac-bd和虚部ad+bc。文心一言:可以使用如下算法来计算复数a+bi和c+di的积,且只需进行三次实数乘法:1.将a和b相乘,得到ab;2.将c和d相乘,得到cd;3.将ab+cd赋......
  • 基于搜索的同构类约束路径规划算法-1
    摘要:目标导向的路径规划在移动机器人领域是基础且被广泛研究。由于障碍物的存在而产生的同一类轨迹,被定义为可以通过逐渐弯曲和拉伸而在不与障碍物碰撞的情况下相互转换的轨迹集合。在诸如预测动态实体的路径和计算具有动态约束的路径规划的启发式算之类的应用中,频繁出现寻找限制......
  • 基于搜索的同构类约束路径规划算法
    摘要:目标导向的路径规划在移动机器人领域是基础且被广泛研究。由于障碍物的存在而产生的同一类轨迹,被定义为可以通过逐渐弯曲和拉伸而在不与障碍物碰撞的情况下相互转换的轨迹集合。在诸如预测动态实体的路径和计算具有动态约束的路径规划的启发式算之类的应用中,频繁出现寻找限制......
  • 共同构筑企业数字底座!启明信息自主云平台赋能企业数智化
    过去十年,企业数字化经历了服务器、云化、云原生化的转型过程。目前云原生技术已成为企业加速数字化转型、实现高效创新的最佳技术支撑,而在以“数实相融算启未来”为主题的2023中国国际大数据产业博览会上,启明信息技术股份有限公司(以下简称:启明信息)除展示企业11款最新数智化科技成......
  • Java-Day-25( 字节输入流 + FileInputStream 和 FileOutputStream + FileReader 和 Fi
    Java-Day-25InputStream(字节输入流)InputStream抽象类是所有类字节输入流的超类InputStream常用的子类FileInputStream:文件输入流BufferedInputStream:缓冲字节输入流ObjectInputStream:对象字节输入流FileInputStream和FileOutputStreamFileInputStream(文......
  • 共同构筑企业数字底座!启明信息自主云平台赋能企业数智化
    过去十年,企业数字化经历了服务器、云化、云原生化的转型过程。目前云原生技术已成为企业加速数字化转型、实现高效创新的最佳技术支撑,而在以“数实相融算启未来”为主题的2023中国国际大数据产业博览会上,启明信息技术股份有限公司(以下简称:启明信息)除展示企业11款最新数智化科技成......