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
 15
 16 bool TreeCmp(BinTree * a, BinTree * b); //判断a树与b树是否同构
 17 BinTree * BinTree_new(int n);
 18
 19 int main()
 20 {
 21     int n;
 22     scanf("%d", &n);
 23     BinTree * a = BinTree_new(n);
 24     scanf("%d", &n);
 25     BinTree * b = BinTree_new(n);
 26
 27     bool flag = TreeCmp(a, b);
 28     if (flag)
 29         printf("Yes");
 30     else
 31         printf("No");
 32
 33     return 0;
 34 }
 35
 36 BinTree * BinTree_new(int n)
 37 {
 38     if (n == 0)
 39     {
 40         return  NULL;
 41     }
 42     else
 43     {
 44         int i, li, ri;
 45         ElemType c, lc, rc;
 46         BinTree * T = (BinTree *)malloc(n * sizeof(BinTree));
 47         bool *head = (bool *)malloc(n * sizeof(bool));
 48
 49         memset(head, true ,sizeof(head));
 50
 51         for ( i = 0; i < n ; ++i )
 52         {
 53             scanf(" %c %c %c", &c, &lc, &rc);
 54
 55             li = lc-‘0‘;
 56             ri = rc-‘0‘;
 57
 58             T[i].data = c;
 59
 60             if (lc != ‘-‘)
 61             {
 62                 T[i].left = &T[li];
 63                 head[li] = false;
 64             }
 65             else
 66                 T[i].left = NULL;
 67
 68             if (rc != ‘-‘)
 69             {
 70                 T[i].right = &T[ri];
 71                 head[ri] = false;
 72             }
 73             else
 74                 T[i].right = NULL;
 75
 76         }
 77
 78         //寻找树的树根(树根没有其它的结点指向它)
 79         for ( i = 0; i < n ; ++i )
 80             if (head[i] == true)
 81                 break;
 82         free(head);
 83         return &T[i];
 84     }
 85 }
 86
 87 bool TreeCmp(BinTree * a, BinTree * b)
 88 {
 89     if (a == NULL && b == NULL)//两棵树都为空
 90         return true;
 91
 92     if (a == NULL || b == NULL)//有一棵树为空
 93         return false;
 94
 95     if (a->data != b->data)//树结点的值不相等
 96         return false;
 97
 98     if (a->left == NULL && b->left == NULL)//两棵树的左子树都为空
 99         return TreeCmp(a->right, b->right);//就比较右子树
100
101     //两棵树的左子树都不为空,且两个值相等就比较两棵树的子树
102     if (a->left != NULL && b->left != NULL &&(a->left->data == b->left->data))
103         return (TreeCmp(a->left,b->left)&&TreeCmp(a->right,b->right));
104
105     //交换后再比较
106     else
107         return (TreeCmp(a->left,b->right)&&TreeCmp(a->right,b->left));
108 }
时间: 2024-10-06 11:43:07

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

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

目录 一.题意理解 二.求解思路 2.1 二叉树表示 2.2 程序框架搭建 2.3 如何建二叉树 2.4 如何判别两二叉树同构 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html 一.题意理解 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构的".现给定两棵树,请你判断它们是否是同构的. 输入格式

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

树的实现与操作(C语言实现)

首先来简单说下一些关于的基本概念. 树是一种非线性的数据结构 1,树是由 n(n>=0)个结点组成的有限集合 如果n = 0 ,称为空树 如果n > 0,则: 有一个特定的称之为根(root)的结点,它只有直接后继,但没有直接前驱 除了根以外的其他结点划分为:m(m>=0)个互不相交的有限集合,T0,T1,T2-Tn-1,每个集合又是一棵树,并且称之为根的子树 2,树中的概念: 树的结点包括一个数据及若干指向子树的分支 结点拥有的子树树称为结点的度 度为0的结点称为叶结点 度不为0的结点

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

Java数据结构-树及树的存储结构

树的定义:n(n>=0)个节点的有限集. n=0时称为空树. n!=0时为非空树,有且仅有一个特定的节点--根:n>1时,其它节点可以分为m(m>0)个互不相交的有限集T1~Tm,其中每一个集合本身又是一棵树,并且称为根的子树. 树的一些基本术语: 树的结点:由一个数据元素和若干个指向其子树的分支组成. 结点的度:结点所拥有的子树的个数(即分支数)称为该结点的度. 叶子结点:度为0的结点称为叶子结点,或者称为终端结点. 分支结点:度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结

树-伸展树(Splay Tree)

伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造. (01) 伸展树属于二叉查找树,即它具有和二叉查找树一样的性质:假设x为树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x].如果y是x的左子树中的一个结点,则key[y] <= key[x]:如果y是x的右子树的一个结点,则key[y] >= key[x]. (02) 除了拥有二叉查找树的性质

9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

高级数据结构:优先队列、图、前缀树、分段树以及树状数组详解

优秀的算法往往取决于你采用哪种数据结构,除了常规数据结构,日常更多也会遇到高级的数据结构,实现要比那些常用的数据结构要复杂得多,这些高级的数据结构能够让你在处理一些复杂问题的过程中多拥有一把利器.同时,掌握好它们的性质以及所适用的场合,在分析问题的时候回归本质,很多题目都能迎刃而解了. 这篇文章将重点介绍几种高级的数据结构,它们是:优先队列.图.前缀树.分段树以及树状数组. 一.优先队列 1.优先队列的作用 优先队列最大的作用是能保证每次取出的元素都是队列中优先级别最高的,这个优先级别可以是自定

剑指Offer——Trie树(字典树)

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优