首页 > 其他分享 >数据结构【树篇】(二)

数据结构【树篇】(二)

时间:2024-01-08 16:31:39浏览次数:36  
标签:结点 struct int root 树篇 数据结构 Root1 Root2


数据结构【树篇】(二)



文章目录

  • 数据结构【树篇】(二)
  • 前言
  • 为什么突然想学算法了?
  • 为什么选择码蹄集作为刷题软件?
  • 目录
  • (一)、树的存储
  • (二)、树和森林的遍历——并查集
  • (三)、并查集的优化
  • 结语



前言

数据结构【树篇】(二)_算法

为什么突然想学算法了?

> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下竞争压力逐渐增大,无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个寒假巩固速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~

数据结构【树篇】(二)_数据结构_02


为什么选择码蹄集作为刷题软件?

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
.

数据结构【树篇】(二)_c++_03


目录

(一)、树的存储

.
参考代码

#define MAX_TREE_SIZE 100       //树中最多结点数

//双亲表示法(顺序存储)
typedef struct{                 //树的结点定义
    int data;                   //数据元素
    int parent;                 //双亲位置域
}PTNode;

typedef struct{                  //树的类型定义
    PTNode nodes[MAX_TREE_SIZE]; //双亲表示
    int n;                       //结点数
}PTree;

//孩子表示法(顺序+链式存储)
struct CTNode{
    int child;                   //孩子结点在数组中的位置
    struct CTNode *next;         //下一个孩子
};
typedef struct {
    int data;
    struct CTNode *firstChild;   //第一个孩子
}CTBox;
typedef struct {
    CTBox nodes[MAX_TREE_SIZE];
    int n,r;                     //结点数和根的位置
}CTree;

//孩子兄弟表示法(链式存储)
//树的存储——孩子兄弟表示法
typedef struct CSNode{
    int data;                               //数据域
    struct CSNode *firstchild,*nextsibling; //第一个孩子和右兄弟指针
}CSNode,*CSTree;

(二)、树和森林的遍历——并查集

#define SIZE 13
int UFSets[SIZE];               //集合元素数组

//初始化并查集
void Initial(int S[]){
    for(int i=0;i<SIZE;i++)
        S[i]=-1;
}

//Find "查"操作,找x所属集合(返回x所属根结点)
//最坏时间复杂度O(n)
int Find(int S[],int x){
    while(S[x]>0)               //循环寻找x的根
        x=S[x];
    return x;                   //根的S[]小于0
}

//Union "并"操作,将两个集合合并为一个
//最坏时间复杂度O(1)
void Union (int S[],int Root1,int Root2){
    //要求Root1与Root2是不同的集合
    if(Root1==Root2) return;
    //将根据Root2连接到另一根Root1下面
    S[Root2]=Root1;
}

(三)、并查集的优化

//优化
void Union (int S[],int Root1,int Root2){
    if(Root1==Root2) return;
    if(S[Root2]>S[Root1]){          //Root2结点数更少
        S[Root1] += S[Root2];       //累加结点总数
        S[Root2]=Root1;             //小树合并到大树
    }else{
        S[Root2] += S[Root1];       //累加结点总数
        S[Root1]=Root2;             //小树合并到大树
    }
    S[Root2]=Root1;
}

//Find "查"操作优化,先找到根节点,再进行“压缩路径”
int Find(int S[],int x){
    int root =x;
    while(S[root]>=0) root=S[root];     //循环找到根
    while(x!=root){                     //压缩路径
        int t=S[x];                     //t指向x的父节点
        S[x]=root;                      //x直接挂到根节点下
        x=t;
    }
    return root;                        //返回根节点编号
}

结语

感谢大家一直以来的不断支持与鼓励,码题集题库中的进阶塔350题正在逐步更新,之后会逐步跟进星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?

另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~

愿你的结局,配得上你一路的颠沛流离。

数据结构【树篇】(二)_数据结构_04


标签:结点,struct,int,root,树篇,数据结构,Root1,Root2
From: https://blog.51cto.com/u_15745546/9146857

相关文章

  • 算法与数据结构(开篇)
    基本概念:算法(Algorithm):⼀个计算过程,解决问题的⽅法NiklausWirth:“程序=数据结构+算法”时间复杂度时间复杂度:⽤来评估算法运⾏效率的⼀个式⼦经验当算法过程出现循环折半的时候,复杂度式⼦中会出现logn.时间复杂度是⽤来估计算法运⾏时间的⼀个式⼦(单位)常⻅的时间复杂度(按效率排......
  • 严蔚敏《数据结构》存储结构
    目录1.单链表2.双向链表3.带头结点的链表4.顺序栈5.单链队列6.循环队列7.广义表头尾链表存储8.广义表的扩展线性链表存储9.二叉树二叉链表存储表示10.树的双亲表示法11.树的孩子链表存储表示(孩子表示法)12.树的孩子兄弟表示法(二叉树表示法)13.二叉树的二叉线索存储......
  • 数据结构——顺序线性表(向量)
    参考文章:数据结构(顺序表——线性表)_创建顺序线性表sl,调用initlist()函数对sl初始化-CSDN博客以下是作为个人笔记,自己学习用。线性表是具有相同特性的数据元素的一个有限序列,在线性表中每个数据元素由逻辑序号唯一确定。线性表的特性:1.有穷性:表中元素个数是有限的。2.一致性:表中所......
  • 数据结构【线性表之单链表】
    链表链表:线性表还可以使用链式存储方式保存,即线性表中的各个元素保存在各自的存储空间中,形成一个个节点。这些结点在内存的地址不要求是相邻的,它们之间通过指针连接起来。特点:灵活存储,不要求预先分配一块连续的空间,而是按需分配,随时需要,随时分配不要求分配的空间必须是相邻的没有......
  • 数据结构线性表之顺序表
    定义:一个线性表是由同类型数据元素构成的有限序列一般地,当表示一个由n(n>=0)个元素组成的线性表L时,将线性表中的所有元素列在一对括号中,每个元素之间以逗号分隔,如L=(a0,a1,....,an-1)不搞的像数据那么麻烦了,按我理解的来表项:线性表中的数据元素表头元素:线性表的第一个元素表尾元素:......
  • Redis 底层数据结构
    在Redis数据结构和对象机制中提到的图中,我们知道,可以通过redisObject对象的type和encoding属性。可以决定Redis主要的底层数据结构:SDS、QuickList、ZipList、HashTable、IntSet、ZskipList。一、简单动态字符串(SDS)先来看看传统的C语言如何存储字符串的:比如一个"Redis"......
  • 数据结构简介之算法
    时间复杂度算法的时间复杂度_算法时间复杂度-CSDN博客时间复杂度可以参考这篇文章超级详细!!!为什么不使用算法的绝对运行时间来衡量算法的时间效率?同一个算法处理不同数量的数据时,所花的绝对运行时间可能不同。同一个算法处理相同数量的数据时,在不同配置的电脑上的绝对运行时间也可能......
  • 数据结构简介
    什么是数据?数据是指所有能输入计算机并被计算机程序处理的符号的集合。源程序、文档、地图、照片其实都是数据。数据结构数据结构分为逻辑结构和物理结构。逻辑结构:主要是数据元素之间的逻辑关系,物理结构指的是数据结构在计算机种的表示及存储方式。逻辑结构包含集合、线性结构、树......
  • 做题记录:数据结构 I
    标*的题目是个人认为质量较高或比较符合个人喜好的题目。*I.P5278算术天才⑨与等差数列尝试寻找一个序列满足为等差数列的充分必要条件。显然需要有\(\max-\min=(r-l)k\)。直接要求等差的话,信息不好合并。但等差的限制有一个必要条件是,差分序列的\(\gcd\)为\(k......
  • 【数据结构】详细剖析线性表
    顺序表与链表的比较导言大家好,很高兴又和大家见面啦!!!经过这段时间的学习与分享,想必大家跟我一样都已经对线性表的相关内容比较熟悉了。为了更好的巩固线性表相关的知识点,下面我们一起将线性表这个章节的内容梳理一遍吧。一、线性表线性表的相关概念线性表时具有相同数据类型的个数据......