小白专场-树的同构-c语言实现.md

目录

  • 一、题意理解
  • 二、求解思路
    • 2.1 二叉树表示
    • 2.2 程序框架搭建
    • 2.3 如何建二叉树
    • 2.4 如何判别两二叉树同构

更新、更全的《数据结构与算法》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html

一、题意理解

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

输入格式:输入给出2棵二叉树的信息:

  • 先在一行中给出该树的结点树,随后N行
  • 第i行对应编号第i个结点,给出该结点中存储的字母、其左孩子结点的编号、右孩子结点的编号
  • 如果孩子结点为空,则在相应位置给出“-”

如下图所示,有多种表示的方式,我们列出以下两种:

二、求解思路

  1. 二叉树表示
  2. 建二叉树
  3. 同构判别

2.1 二叉树表示

结构数组表示二叉树:静态链表

/* c语言实现 */

#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1

struct TreeNode
{
  ElementType Element;
  Tree Left;
  Tree Right;
} T1[MaxTree], T2[MaxTree];

2.2 程序框架搭建

需要设计的函数:

  • 读数据建二叉树
  • 二叉树同构判别
/* c语言实现 */

int main():
{
  建二叉树1;
  建二叉树2;
  判别是否同构并输出;

  return 0;
}

int main()
{
  Tree R1, R2;

  R1 = BuildTree(T1);
  R2 = BuildTree(T2);
  if (Isomorphic(R1, R2)) printf("Yes\n");
  else printf("No\n");

  return 0;
}

2.3 如何建二叉树

/* c语言实现 */

Tree BuildTree(struct TreeNode T[])
{
  ...;
  scanf("%d\n", &N); // 输入需要建立树的长度
  if (N) {
    ...;
    for (i=0; i<N; i++) {
      scanf("%c %c %c\n", &T[i].Element, &cl, &cr);
      ...;
    }
    ...;
    Root = ??? // 可以通过T[i]中没有任何结点的left(cl)和right(cr)指向他这个条件获取。
  }
  return Root;
}
/* c语言实现 */

Tree BuildTree(struct TreeNode T[])
{
  ...;
  scanf("%d\n", &N); // 输入需要建立树的长度
  if (N) {
    for (i=0; i<N; i++) check[i] = 0;
    for (i=0; i<N; i++) {
      scanf("%c %c %c\n", &T[i].Element, &cl, &cr);
      if (cl != '-'){
        T[i].Left = cl-'0';
        check[T[i].Left] = 1;
      }
      else T[i].Left = Null;
      ...;  // 对cr的对应处理
    }
    for (i=0; i<N; i++)
      if (!check[i]) break;
    Root = i; // 可以通过T[i]中没有任何结点的left(cl)和right(cr)指向他这个条件获取。
  }
  return Root;
}

2.4 如何判别两二叉树同构

/* c语言实现 */

int Isomorphic(Tree R1, Tree R2)
{
  if ((R1 == Null) && (R2 == Null)) // 左右子树都为空
    return 1;
  if  (((R1==Null)&&(R2!=Null)) || ((R1!=Null)&&(R2==Null)))
    return  0;  // 其中一颗子树为空
  if  (T1[R1].Element != T2[R2].Element)
    return  0;  // 空结点为空
  if  ((T1[R1].Left == Null ) && ( T2[R2].Left == Null)) // 根的左右结点没有子树
    return  Isomorphic(T1[R1].Right, T2[R2].Right);
  if (((T1[R1].Left != Null) && (T2[R2].Left!=Null)) &&
      ((T1[T1[R1].Left].Element) == (T2[T2[R2].Left].Element))) // 左右子树不需要转换
  {
    return (Isomorphic(T1[R1].Left, T2[R2].Left) &&
            Isomorphic(T1[R1].Right, T2[R2].Right));
  }
  else { // 左右子树需要转换
    return (Isomorphic(T1[R1].Left, T2[R2].Right) &&
            Isomorphic(T1[R1].Right, T2[R2].Left));
  }
}

原文地址:https://www.cnblogs.com/nickchen121/p/11518873.html

时间: 2024-11-03 12:29:28

小白专场-树的同构-c语言实现.md的相关文章

小白专场-树的同构-python语言实现

目录 一.题意理解 二.求解思路 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:<https://www.cnblogs.com/nickchen121/p/11407287.html 一.题意理解 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构的".现给定两棵树,请你判断它们是否是同构的. 输入格式:输入给出2棵二叉树的信息: 先在一行中给出该树的结点树,随后N行 第i行对应编号第i

03-树1 树的同构 (C语言链表实现)

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <stdbool.h> 5 6 typedef char ElemType; 7 8 typedef struct BinTree 9 { 10 ElemType data; 11 struct BinTree *left; 12 struct BinTree *right; 13 }BinTree; 14

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

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

03-树1 树的同构

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

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

哈夫曼树(一)之 C语言详解

本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请帮忙指出! 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 哈夫曼树的介绍 Huffman

ZOJ--3602--Count the Trees【DFS+Hash】树的同构

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 题意:给出一棵有n个节点的二叉树和一棵有m个节点的二叉树,给出每个节点的左右子树信息,问这两棵树有几个相同的子树. 思路:树的同构,比赛时没想法,赛后看的别人的解题报告.实际上是给每个节点的左右子树一个哈希值,不用像字符串哈希那么麻烦,直接给每个子树一个数字标记就行了,用map映射每个节点的左子树和右子树信息对应一个标记值,用DFS给两棵树的每个节点都赋一个哈

BZOJ 4337 树的同构

很明显,这应该是一道模版题(因为我很快就在一本书上找到了这道题的模版),不过令我比较奇怪的大概是有根树和无根树的概念,以及在这道题目中根有卵用吗? (看来树这一块的知识还是要补一下). 树的同构很明显应该是用hash来判断的,当然了,不同的人设计的hash函数不同了.这道题正确的应该是要在树的重心上面跑这道题的模版,(如果你要问我树的重心是啥,我只能跟你说,如果我知道的话,下面这份代码就不会把几乎所有的点都跑一次了,但是由于N<=50,M <= 50 很明显这样跑完还是很快的,事实证明也只跑了

PTA 树的同构(25 分)

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