树的同构

树的同构同构的定义:给定两棵树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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 复录比低的计算机学校,这7所报录比低的实力院校,赶紧捡漏一波!

    复录比低的计算机学校,这7所报录比低的实力院校,赶紧捡漏一波!原标题:这7所报录比低的实力院校,赶紧捡漏一波!俗话说:考研选对专业和院校,就等于成功了一半。很多准考研er对如何选择适合自己的院校仍感到很焦虑,而报录比就是选择院校专业很重要的参与因素之一。报录比报录比是指报考人数和实际录取人数的比例,可以帮助考生了解院校报考人数、拟录取人数与实际录取人数之间的比例。如果报录比大于1,就说明报考的人数比录取的人数多;如果报录比小于1,就说明报考的人数比录取的人数…

    2022年6月9日
    59
  • uint16_t转换成char_16bit转8bit

    uint16_t转换成char_16bit转8bit简单来说,uint8_t/uint16_t/uint32_t/uint64_t这些数据类型都只是别名而来,具体如下:一、C语言数据基本类型在C语言中有6种基本数据类型:short、int、long、float、double、char1)整型:shortint、int、longint2)浮点型:float、double3)字符类型:char二、分析uint8_…

    2025年9月30日
    4
  • ubuntu下安装python3

    ubuntu下安装python3安装步骤ubuntu本身安装的时候已经自带python了,在终端输入python-V查看当前python版本python-V如上图,当前电脑安装的python版本是2.7.12下载最新的python3sudoapt-getinstallpython3如图,我的电脑本身已经装有python3了,如果没安装有,则应该安装最

    2022年6月23日
    47
  • python modis数据拼接_python读取modis数据

    python modis数据拼接_python读取modis数据本期记录只上干活,废话不多说,主要是后面与HEG配合使用,实现一系列研究与反演操作。python环境:Python3.5.2+Pycharm模块包:pyhdf安装方法(命令行输入):pipinstallpyhdf一、获取hdf数据集:frompyhdf.SDimportSDHDF_FILR_URL=”E:\Persona_project\Py-Program\RS\modis\M…

    2025年6月24日
    5
  • Java类加载,getClassLoader()

    Java类加载,getClassLoader()转自【java类加载的深入研究1】loadClass()的研究,IBM深入探讨Java类加载器类加载器基本概念顾名思义,类加载器(classloader)用来加载Java类到Java虚拟机中。一般来说,Java虚拟机使用Java类的方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载…

    2022年5月27日
    32
  • html 鼠标形状箭头,CSS各种鼠标样式介绍

    html 鼠标形状箭头,CSS各种鼠标样式介绍大家否曾注意到有些网站的鼠标不是规则的斜向上箭头的形状,而是十字形,或者是向左的箭头,或者是个问号等等。当你想在网页的不同位置让鼠标显示不同形状,以体现不同的功能区;当你想让你的网站体现与众不同的风格时,考虑一下在鼠标样式上下功夫吧。其实鼠标样式的用途还是极为广泛的,那么怎样才能实现鼠标的不同样式呢?这就要用到css层叠样式表中的cursor属性了。cursor的属性:pointer:手型c…

    2022年5月27日
    196

发表回复

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

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