树的同构

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


相关推荐

  • html表格空格符是什么,HTML中的空格符号是什么

    html表格空格符是什么,HTML中的空格符号是什么在HTML中的空格符号有:表示不断行的空白; 表示半个空白; 表示一个空白等在平时我们写文章时遇到空格时都会直接输入空格键来达到空格的效果,但是在HTML代码中如果我们输入空格键就会被忽略,达不到空格的效果,今天就像大家介绍HTML中空格代码如何写,希望对大家有所帮助。【推荐课程:HTML课程】方法是HTML空格转义字符,当我们需要几个空白字符时就输入几个例Gxl网提供大量免费、原创、…

    2022年10月4日
    2
  • Y客地址「建议收藏」

    Y客地址「建议收藏」http://www.yeskee.com/fenglibing

    2022年6月24日
    28
  • MOCK测试详解

    MOCK测试详解MOCK测试1.作用: 后端还未完成所有接口开发,但是前端已经完成了前端的开发需要联调,此时可先进行mock测试2.mock准备工作到下面网站https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.11.0/下载moco-runner-0.11.0-standalone.jar然后部署到lin…

    2022年6月20日
    33
  • 浅谈贝叶斯和MCMC

    浅谈贝叶斯和MCMC 转自:http://www.xuyankun.cn/2017/05/13/bayes/ Abstract:最近课业内的任务不是很多,又邻近暑假了,就在网上搜了一些有关于机器学习和深度学习的课程进行学习。网上的资料非常繁多,很难甄别,我也是货比三家进行学习。这是这个系列的第一个笔记,是关于贝叶斯和MCMC一些数学原理的讲解和代码的实现,希望能够深入浅出,叙述的容易让人理解。…(阅…

    2022年5月5日
    37
  • C语言中什么是常量表达式_c语言整型表达式

    C语言中什么是常量表达式_c语言整型表达式常量表达式c语言,整型表达式和常量表达式中都没有变量参与吧?完整问题:好评回答:表达式没有变量参与?不是很清楚这个问题的定义,只是知道(ab)这种表达式下a和b都可以是变量Java编译器对于String常量表达式的优化是什么呢?完整问题:Java编译器对于String常量表达式的优化是什么呢?好评回答:首先把问题摆出来,先看这个代码Stringa=”ab”;Stringb=”a”…

    2022年9月29日
    3
  • python优势有哪些?[通俗易懂]

    python优势有哪些?[通俗易懂]ol是英文orderedlist的缩写,翻译为中文是有序列表。有序列表是一种强调排列顺序的列表,使用标签定义,内部可以嵌套多个 标签。例如网页中常见的歌曲排行榜、游戏排行榜等都可以通过有序列表来定义。定义有序列表的基本语法格式如下: 列表项1 列表项2 列表项3 ……   在上面的语法中, 标签用于定义有序列表, 为具体的列表项,和无序列表类似,每对中 也至少应包含一对 。   在有序列表中,除了type属性之外,还可以为 定义start属..

    2022年10月5日
    3

发表回复

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

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