数据结构之树的概念以及结构

1.树的概念

树是一种非线性的数据结构,是由n(n>=0)有限节点的组成的一个具有线性关系的集合。

叫树的原因是因为它看起来像是一颗倒挂的树,只不过是根朝上,叶朝下

  1. 树的一个特殊节点叫做根节点 ,根节点没有前驱节

  2. 除了根节点之外,其余节点被分割M个互不相交的集合T1,T2…,而每个集合都是与树结构相同的子树,每个子树都有属于它自己的‘根节点’,可以有0个或多个后继。

  3. 由此可以看出来树的定义是递归的!

子树与子树之间是不能有交集的,否则就不是树的结构!

2.树的相关概念

  1. 节点的度:一个节点所含有的子树的个数称为该节点的度!例如A的度就是6,因为A有6个子树

    度的概念是相对于节点而言的,每个节点都有属于它的度!子树要整体的去看(或者直接看该节点的分支有几个)例如E包括它以下的所有节点都是属于A的一颗子树!但是I,还有J以下的所有节点是属于E的两颗子树!

  2. 叶节点或终端节点:度为0的节点就是叶节点(终端节点),例如H,I,P,Q,K,L…

  3. 非终端节点或者分支节点:度不为0的节点 ,与叶节点(终端节点)相对的概念。例如:E,J,F,G…

  4. 父节点或双亲节点:含有子节点的节点就是其子节点的父节点(双亲节点)。

    父节点与子节点身份同时存在不冲突!例如E是,I,J这两个节点的父节点,又是A的子节点!

  5. 子节点或孩子节点:一个节点含有的子树的节点称之为该节点的子节点

    说实话这句话说的挺绕的,其实就是这个节点上面连着一个节点,这就是上面那个节点的子节点

  6. 兄弟节点:有同一个父节点的节点彼此之间就是兄弟节点

    有同一个爸就是兄弟!

  7. 树的度:一棵树中,最大节点的度称之为该树的度。例如上面的树的度就是6.

    每个节点都有属于它自己的度!而其中最大的那个度就是该树的度!(那个度不一定存在于根节点!)

  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推

    从根节点开始数起!是下面概念的基础

  9. 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

  10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点

  11. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

    再例如E是 I,J,P,Q的祖先,但是不是K,L的祖先,因为E的分支没有经过K.L。

  12. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

    子,父,祖先,子孙这几个概念互不冲突,可以同时存在于一个节点,只是可能对象不一样!

  13. 森林:由m(m>0)棵互不相交的树的集合称为森林;

    应用并查集

3.树的结构

关于树的结构的定义有

struct TreeNode
{int date;struct TreeNode* child1;struct TreeNode* child2;struct TreeNode* child3;struct TreeNode* child4;// ........
}

这种结构的坏处在定义繁琐!在不知道度的情况下很麻烦!

除非给了固定的度的大小!

#define N 5
struct TreeNode
{int date;struct TreeNode* children[N];int childsize;
}//这种结构是类似于静态的顺序表!但是这样很浪费!

在上面的基础上进一步改进

struct TreeNode
{int date;//用一个顺序表存储孩子节点的指针!struct TreeNode** children;//为什么要二级指针呢?因为要存储数据是数组的指针,所以要二级指针数组来存储!int childsize;int childcapacity;
}

但是的上面的所有结构都不是最优解!

虽然更加的直观!但是还是不够方便!

所以引入了一种新结构!左孩子右兄弟!

typedef int DateType;
struct TreeNode
{struct TreeNode* Child;// 第一个孩子结点struct TreeNode* brother;// 指向其下一个兄弟结点DateType date;//存储数据!
}

如图:A指向它的第一个孩子B,因为A没有兄弟则兄弟指向空!

然后再B指向它的第一个孩子,然后指向它的兄弟C

这样子就可以通过兄弟找兄弟!

该结构的运用!

void printTree(struct TreeNode* parent)
{if(parent == NULL)return;struct TreeNode* cur = parent;while(cur){printf("%d",cur->date);//先访问当前节点printTree(cur->child);//访问自孩子节点cur = cur->brother//再访问兄弟节点!}
}

初次之外还有一个双亲表示法


这种方式方便找祖先!

4.树在实际中的运用(表示文件系统的目录树结构)

数据结构之树的概念以及结构相关推荐

  1. 【数据结构】树的概念与结构 | 树的几种常见表示方法

    前言: 本章将正式开启数据结构中 "树" 部分的讲解,本章将介绍树的概念和结构,以及树的表示方法. 0x00 树的概念

  2. 【数据结构】二叉树的概念及结构

    提示:学习此篇博客之前,可以先学习[数据结构]树的概念及结构. 文章目录 前言 1.二叉树的概念 2.特殊的二叉树 3.二叉树的性质 4.二叉树的存储结构 前言 普通二叉树,很难构成现实的应用场景,但 ...

  3. 教你一目了然树的概念与结构(入门级)

    文章目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2 特殊的二叉树: 2. ...

  4. 【数据结构基础/接口函数编写】二叉树第一弹之树和堆的概念和结构、基础堆接口函数的实现(编写思路加逻辑分析加代码实操,一应俱全的汇总)

    文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 二叉树的概念及结构 二叉树的概念 特殊的二叉树: 二叉树的存储结构 二叉树的性质 顺序储存 链式储存 堆 堆的概念及结构 堆的实现 头文件 ...

  5. 数据结构之树与二叉树

    数据结构之树与二叉树 1.树的概念及结构 1.1.什么是树? 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.树是递归定义的.之所以把它叫做树是因为它看起来像 ...

  6. (数据结构)树和二叉树相关知识点

    1.树的概念及结构 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. ...

  7. 【数据结构】树与二叉树

    目录 1.树的概念及结构 1.1.概念 1.树的特点 2.树与非树 1.2.概念 (重要) 1.3.树的表示形式 2.二叉树(重点) 2.1.概念 2.2.二叉树的特点 2.3.两种特殊的二叉树 1. ...

  8. 【C语言 数据结构】树

    文章目录 树 一.树的概念 二.树的应用 1)树可表示具有分枝结构关系的对象 2)树是常用的数据组织形式 三.树的表示 四.树的基本术语 五.树的四种表示方法 5.1 双亲表示法 5.2 孩子表示法 ...

  9. 简述数据字典的结构及其作用_数据结构——树基本概念及其遍历

    树 1.概念 树结构是一种描述非线性层次关系的数据结构 在一个数结构中,有且仅有一个结点没有直接前驱,这个结点就是树的结点. 除根结点外,其余每个结点有且仅有一个直接前驱. 每个结点可以有任意多个直接 ...

最新文章

  1. php面向对象mysqli,php+mysqli使用面向对象方式更新数据库实例
  2. 【组合数学】生成函数 ( 移位性质 )
  3. linux下kvm设备配置,Linux下为KVM 配置桥接设备
  4. LINE: Large-scale Information Network Embedding
  5. 【MM配置】评估和账户确定(Valuation Account Determination) - 2
  6. 在php100 防恶意注册这个需要怎么填,WordPress防止恶意注册代码
  7. 多样人群,多面生活——观星盘八大策略人群洞察
  8. inux安装vsftpd及配置详解
  9. 谷歌的下一个×××烦
  10. Mysql插件HandlerSocket的应用
  11. python脚本-自动检测Base16、32、64、85系列编码、多层解码(新增base91解码)
  12. html表格 超链接无效,excel表格超链接失效怎么处理
  13. QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置
  14. 对耳朵伤害最小的耳机有哪些,不伤耳的蓝牙耳机推荐
  15. 配置Web DashBoard
  16. 基于Python语言量化金融分析师AQF实训项目
  17. java中的NIO,BIO,AIO
  18. 谁是程序员的祖师爷?
  19. Visual Studio Code(VSCODE)语言设置为中文
  20. blueman.bluez.errors.DBusFailedError: Protocol not available...

热门文章

  1. 口袋精灵加速版java_口袋妖怪TCG!口袋对决加速版教程(免ROOT)
  2. 【计算机网络 (谢希仁) 习题题解】第1章 概述
  3. isreal 实阵判断
  4. C语言学生随机抽号演讲计分系统
  5. ant design pro 实现异步下载文件
  6. ROS2之DDS问题汇集
  7. 边下边看的BT资源搜索下载工具:Tribler for Mac
  8. 不好意思辞职怎么办?
  9. 零基础syzkaller挖掘Linux内核漏洞
  10. TX2刷机和使用常见问题