树的同构[天梯赛二叉树专项训练]

文章目录

题目描述


cpp 复制代码
输入样例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
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

思路

1.用结构体数组模拟二叉树--由于题目中给定节点值均不相同,因此这种方法可取

2.建树时,存储每棵树的根节点,后序判断是否同构时,从根节点开始判断

3.Compare函数判断两棵树是否同构

①当前两棵树均为空树--同构

②一棵树为空,一棵树不为空--不同构

③两棵树均不为空,但是值不相同--不同构

④除上述三种特殊情况外,进一步递归判断第一棵树和第二棵树的左右孩子是否相同或交叉相等

AC代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
typedef struct node
{
    char data;
    int left, right;
}node;
node tree1[N], tree2[N];
bool vis[N];
bool Judge_Num(char x)
{
    return x >= '0' && x <= '9';
}
int Init(node t[])
{
    int n;
    char root, l, r;
    cin >> n;
    if(!n) return -1;
    memset(vis, false, sizeof(vis));
    for(int i = 0; i < n; i ++)
    {
        cin >> root >> l >> r;
        //cout << root << " " << l << " " << r << endl;
        t[i].data = root;
        if(Judge_Num(l))
        {
            int x = l - '0';
            t[i].left = x;
            vis[x] = true;
        }
        else t[i].left = -1;
        if(Judge_Num(r))
        {
            int x = r - '0';
            t[i].right = x;
            vis[x] = true;
        }
        else t[i].right = -1;
    }
    for(int i = 0; i < n; i ++)
    {
        if(!vis[i]) return i;
    }
}

bool Compare(int root1, int root2)
{
    if(root1 == -1 && root2 == -1) return true;
    if((root1 == -1 && root2 != -1) || (root1 != -1 && root2 == -1)) return false;
    if(tree1[root1].data != tree2[root2].data) return false;
    return (Compare(tree1[root1].left, tree2[root2].left) && Compare(tree1[root1].right, tree2[root2].right))
        || (Compare(tree1[root1].left, tree2[root2].right) && Compare(tree1[root1].right, tree2[root2].left)); 
}
int main()
{
    int root1 = Init(tree1);
    int root2 = Init(tree2);
    if(Compare(root1, root2)) cout << "Yes" << endl;
    else cout << "No" << endl;
    return 0;
}

欢迎大家批评指正!!!

相关推荐
星空露珠3 小时前
速算24点检测生成核心lua
开发语言·数据库·算法·游戏·lua
历程里程碑3 小时前
Linux15 进程二
linux·运维·服务器·开发语言·数据结构·c++·笔记
happygrilclh4 小时前
高压高频电源的pid算法
算法
格林威4 小时前
Baumer相机铸件气孔与缩松识别:提升铸造良品率的 6 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·opencv·算法·安全·计算机视觉·堡盟相机·baumer相机
葫三生4 小时前
存在之思:三生原理与现象学对话可能?
数据库·人工智能·神经网络·算法·区块链
Evand J4 小时前
【MATLAB例程】无人机三维路径规划|A*,RRT(快速随机树算法), APF(人工势场法)算法对比|可自定义起终点、障碍物坐标。附下载链接
算法·matlab·无人机·astar·路径规划·rrt·apf
嵌入小生0074 小时前
双向链表、双向循环链表之间的异同---嵌入式入门---Linux
linux·c语言·数据结构·链表·嵌入式·小白
少许极端4 小时前
算法奇妙屋(二十七)-全排列与子集问题
算法·剪枝·回溯·递归
sali-tec4 小时前
C# 基于OpenCv的视觉工作流-章20-仿射变换
图像处理·人工智能·opencv·算法·计算机视觉
u0109272714 小时前
实时数据流处理
开发语言·c++·算法