树的同构

树的同构同构的定义:给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。更加具体的理解为:两棵树中的每两个对应结点的孩子必须相同,左右位置可不一样。树的存储结构

大家好,又见面了,我是你们的朋友全栈君。

同构的定义:给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。

更加具体的理解为:两棵树中的每两个对应结点的孩子必须相同,左右位置可不一样。

树的存储结构:结构数组。链表在对输入进行存储时没有数组方便。

如:输入如下样例后结构数组内容

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

<span role="heading" aria-level="2">树的同构

要注意第一个输入的不一定是根结点,没有父亲的结点才是根结点。

定义:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxTree 10
#define ElementType char
#define Tree int 
#define Null -1

struct TreeNode {
    ElementType Data;
    Tree left;
    Tree right;
}T1[MaxTree],T2[MaxTree];

Tree Initial(struct TreeNode T1[]);
int Judge(Tree rt1, Tree rt2);

T1,T2为全局数组。

建立二叉树:

Tree Initial(struct TreeNode T[]) {
    int N;
    if(scanf("%d",&N)==1){}
    if (N == 0) {
        return -1;
    }
    int i;
    char c1, c2;
    int flag[MaxTree];
    memset(flag, 0, sizeof(int) * MaxTree);
    getchar();
    for (i = 0;i < N;i ++ ) {
        /*cin >> T[i].Data;
        cin >> c1 >> c2;*/
        if(scanf("%c %c %c",&T[i].Data,&c1,&c2)==3){}
        //T[i].Data=getchar();
        getchar();
        /*c1= getchar();
        getchar();
        c2= getchar();
        getchar();*/
        if (c1 == '-')
            T[i].left = Null;
        else {
            T[i].left = c1 - '0';
            flag[T[i].left] = 1;
        }
        if (c2 == '-')
            T[i].right = Null;
        else {
            T[i].right = c2 - '0';
            flag[T[i].right] = 1;
        }
    }
    for (i = 0;i < N;i++) {
        if (flag[i] == 0)
            break;
    }
    Tree root = i;
    return root;
}

判断是否同构,这里很绕:

int Judge(Tree rt1, Tree rt2) {
    if (rt1 == Null && rt2 == Null)
        return 1;
    if ((rt1 == Null && rt2 != Null) || (rt1 != Null && rt2 == Null))
        return 0;
    if (T1[rt1].Data != T2[rt2].Data)
        return 0;
    if (T1[rt1].left == Null && T2[rt2].left == Null)
        return Judge(T1[rt1].right, T2[rt2].right);
    if (T1[rt1].left != Null && T2[rt2].left != Null && T1[T1[rt1].left].Data == T2[T2[rt2].left].Data)
        return (Judge(T1[rt1].left, T2[rt2].left) && Judge(T1[rt1].right, T2[rt2].right));
    else
        return (Judge(T1[rt1].left, T2[rt2].right) && Judge(T1[rt1].right, T2[rt2].left));
}

前三个if是递归到最简的情况,可以直接判断返回,后面则需要递归。

main:

int main() {
    Tree t1 = Initial(T1);
    Tree t2 = Initial(T2);
    //test(t1);
    if (Judge(t1, t2))
        printf("Yes");
    else
        printf("No");
    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155138.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月2日 下午7:36
下一篇 2022年7月2日 下午7:36


相关推荐

  • python浪漫表白源码(附带详细教程)_怎么做表白代码

    python浪漫表白源码(附带详细教程)_怎么做表白代码遇到喜欢的某某某,又想给她一点点新鲜感,可以用上博主的这个鲜花表白代码,本代码用于谈恋爱的任意阶段。先来看看效果图本代码简单易懂,适合Python基础小白使用,用到turtle海龟绘图和简单的输出语句。如遇到不懂得地方和需要其它的浪漫表白代码请联系本人QQ:483062431附上源代码:#绘制玫瑰花并添加文字importturtle#设置画布大小#turtle.screensize(canvwidth=None,canvheight=None,bg=None)turtle.setu

    2025年11月28日
    8
  • SpringMVC工作流程 — 详解

    SpringMVC工作流程 — 详解SpringMVC一,SpringMVC简介二,SpringMVC的工作原理图执行流程三,SpringMVC核心组件前端控制器DispatcherServlet处理器映射器HandlerMapping处理器适配器HandlerAdapter处理器Handler视图解析器ViewResolver一,SpringMVC简介MVC:是一种架构模式,将业务逻辑和页面展示分离,使程序分层、分工合作,既相互独立,又协同合作。MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种

    2022年6月7日
    45
  • .pfx数字证书制作及操作使用

    .pfx数字证书制作及操作使用#.pfx数字证书制作及操作使用使用工具.pfx创建从*.pfx文件提取密钥Java代码操作#工具下载地址链接:http://pan.baidu.com/s/1jHOyIQa密码:aund#创建.pfxCN=名称(一般填公司名称)OU=单位名称O=作者名称L=地区C=国家第一步打开CertManager

    2022年5月20日
    150
  • Python求均值,方差,标准差

    Python求均值,方差,标准差importnumpya 1 2 3 4 5 6 求均值 arr mean np mean arr 求方差 arr var np var arr 求标准差 arr std np std arr ddof 1 print 平均值为 f arr mean print 方差为 f arr var print 标准差为 f

    2026年3月26日
    2
  • java图片转二进制流_java将文件转化成二进制流

    java图片转二进制流_java将文件转化成二进制流二进制流的主要编码格式是base64码。可以在网上找一些在线转base64编码的网站进行尝试转换。例如:http://imgbase64.duoshitong.com/然后通过前端展现和下载。一、前端查看、下载功能实现前端显示二进制流图片(src中放置base64码及二进制流)<imgsrc=”http://dl.ppt123.net/pptbj/201603/2016030410235232.jpg”alt=””><imgsrc=”data:image/png;base

    2022年10月12日
    4
  • 【pvcreate】创建pv

    【pvcreate】创建pvpvcreate 创建 pv 例如 pvcreate dev sda1 dev sda2 nbsp 级可以将 sda1 和 sda2 设备创建称为 pv 设备相关命令 pvs 查看当前系统上的 pv 设备 pvdisplay 查看当前系统上 pv 设备的详细信息 pvscan 扫描当前系统上一共有多少个 pv 即有多少个物理卷做成的 pv pvremove 删除 pv p

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号