基础实验4-2.1 树的同构 (25分)--二叉树

解题思路:

1、建二叉树(静态链表)

不作为任何结点的孩子结点的即为根结点

2、判断是否同构

1)空树,同构

2)两棵树中若只有其中一棵是空树,则不同构

3)两棵树的根结点值不等,不同构

4)若左子树均空,则递归判断右子树

5)若左子树均不空,

比较左子树的根结点值

相等:则没有交换左右子树,判断树1左子树和树2左子树、树1右子树和树2右子树

不等:交换左右子树,判断树1左子树和树2右子树,树1右子树和树2左子树

#include <stdio.h>
#include <string.h>
#define ElemType char
#define Max 10
typedef enum {false,true
             } bool;
typedef struct {
    ElemType Data;
    int Left,Right;
} Tree;
Tree T1[Max],T2[Max];
int BuildTree(Tree T[]) {
    int n;
    scanf("%d",&n);
    int check[n];
    memset(check,0,sizeof(check));
    int i,root=-1;
    char l,r;
    if(n) {
        for(i=0; i<n; i++) {
            scanf("\n%c %c %c",&T[i].Data,&l,&r);
            {
                if(l!=‘-‘) {
                    T[i].Left=l-‘0‘;
                    check[l-‘0‘]=1;
                } else
                    T[i].Left=-1;
                if(r!=‘-‘) {
                    T[i].Right=r-‘0‘;
                    check[r-‘0‘]=1;
                } else
                    T[i].Right=-1;
            }
        }
    }

    for(i=0; i<n; i++) {
        if(!check[i]) {
            root=i;
            break;
        }

    }
    return root;
}
bool Isomorphic(int root1,int root2) {
    if(root1==-1&&root2==-1)//空树,同构
        return true;
    if((root1==-1&&root2!=-1)||(root1!=-1&&root2==-1))//两棵树只有一棵是空树,不同构
        return false;
    if(T1[root1].Data!=T2[root2].Data)//根结点值不等,不同构
        return false;
    if(T1[root1].Left==-1&&T2[root2].Left==-1) { //T1 T2的左子树均空,递归判断T1 T2的右子树
        return Isomorphic(T1[root1].Right,T2[root2].Right);
    }
    if(T1[root1].Left!=-1&&T2[root2].Left!=-1) { //T1 T2左子树均不空
        if(T1[T1[root1].Left].Data==T2[T2[root2].Left].Data)//两棵树的左子树的值相等,不用交换左右子树,递归判断
            return Isomorphic(T1[root1].Left,T2[root2].Left)&&Isomorphic(T1[root1].Right,T2[root2].Right);
        else {//两棵树的左子树的值不等,交换左右子树,递归判断
            return Isomorphic(T1[root1].Right,T2[root2].Left)&&Isomorphic(T1[root1].Left,T2[root2].Right);
        }
    }
}
int main() {
    int r1=BuildTree(T1);
    int r2=BuildTree(T2);
    if(Isomorphic(r1,r2))
        printf("Yes");
    else
        printf("No");
    return 0;
}

原文地址:https://www.cnblogs.com/snzhong/p/12443443.html

时间: 2024-08-30 07:27:15

基础实验4-2.1 树的同构 (25分)--二叉树的相关文章

5-3 树的同构 (25分)

5-3 树的同构   (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数NN (\le 10≤10),即该树的结点数(此时假设结点从0到N-1N?1编号):随后NN行,第i

03-树1 树的同构 (25 分)

给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数N (≤),即该树的结点数(此时假设结点从0到N−1编号):随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母.其左孩子结点

基础实验3-2.3 共享后缀的链表 (25分)

有一种存储英文单词的方法,是把单词的所有字母串在一个单链表上.为了节省一点空间,如果有两个单词有同样的后缀,就让它们共享这个后缀.下图给出了单词“loading”和“being”的存储形式.本题要求你找出两个链表的公共后缀. 函数接口定义: PtrToNode Suffix( List L1, List L2 ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */

基础实验4-2.6 目录树 (30分)- 建树+先序遍历

解题思路:采用将多叉树转化为二叉树的方法(即利用孩子兄弟的结点结构)建立二叉树,最后再先序遍历输出即可 #include <stdio.h> #include <malloc.h> #include <string.h> struct TNode { int space;//记录打印空格数 int prior;//标记是文件还是目录,文件优先级0,目录优先级1(优先级大的优先) char name[261];//文件名 struct TNode *son,*sib;//

基础实验2-2.1 整数的分类处理 (20分)

给定 N 个正整数,要求你从中得到下列三种计算结果: A1 = 能被 3 整除的最大整数 A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数 A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位) 输入格式: 输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数.所有数字都不超过 100,同行数字以空格分隔. 输出格式: 在一行中顺序输出 A1.A2.A3的值,其间以 1 个空格分隔.如果某个数字不存在,则对应输出NONE. 输入样例

PTA 深入虎穴 (正解)和树的同构

在上一篇博客中分享了尝试用单链表修改程序,虽然在Dev上运行没有错误,但是PTA设置的测试点有几个没有通过,具体不清楚问题出现在哪里,所以现在把之前正确的程序放在这里. 7-2 深入虎穴 (30 分) 著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇

SDUT 3340 数据结构实验之二叉树一:树的同构

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含

20172304 蓝墨云实验哈夫曼树

20172304 蓝墨云实验哈夫曼树 实验要求 设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}. 给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树. 并完成对英文文件的编码和解码. 要求: (1) 准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率 (2) 构造哈夫曼树 (3) 对英文文件进行编码,输出一个编码后的文件 (4) 对编码文件进行解码,输出

基础实验1(单臂路由及利用路由器开启DHCP自动分配IP地址)

实验环境:PT 6.2 两台PC:PC1/PC2  一台cisco 2960交换机 一台2620路由器 实验目的:让PC1/PC2属于不同的VLAN,且相互通信.同时自动获取各自网段IP地址. 1.进入2960的配置模式,划分不同的vlan并将PC1/PC2划入不同的网段.并将连通路由器端口转为干道协议. 代码如下: >en #conf t config)#vlan 10 config)#vlan 20 config)#int f0/21 config)#switchport ac vlan 1