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

简介: 数据结构之树的概念以及结构

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

1.树的概念

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

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

  1. 树的一个特殊节点叫做根节点 ,根节点没有前驱节
  2. 除了根节点之外,其余节点被分割M个互不相交的集合T1,T2......,而每个集合都是与树结构相同的子树,每个子树都有属于它自己的‘根节点’,可以有0个或多个后继
  3. 由此可以看出来树的定义是递归的!

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

2.树的相关概念

在·

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

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

  1. 叶节点或终端节点:度为0的节点就是叶节点(终端节点),例如H,I,P,Q,K,L.......
  2. 非终端节点或者分支节点:度不为0的节点 ,与叶节点(终端节点)相对的概念。例如:E,J,F,G.....
  3. 父节点或双亲节点:含有子节点的节点就是其子节点的父节点(双亲节点)。

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

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

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

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

有同一个爸就是兄弟!

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

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

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

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

  1. 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
  2. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
  3. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

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

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

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

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

应用并查集

3.树的结构

关于树的结构的定义有

structTreeNode

{

intdate;

structTreeNode*child1;

structTreeNode*child2;

structTreeNode*child3;

structTreeNode*child4;

// ........

}

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

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

#define N 5

structTreeNode

{

intdate;

structTreeNode*children[N];

intchildsize;

}//这种结构是类似于静态的顺序表!但是这样很浪费!

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

structTreeNode

{

intdate;

//用一个顺序表存储孩子节点的指针!

structTreeNode**children;//为什么要二级指针呢?因为要存储数据是数组的指针,所以要二级指针数组来存储!

intchildsize;

intchildcapacity;

}

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

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

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

typedefintDateType;

structTreeNode

{

structTreeNode*Child;// 第一个孩子结点

structTreeNode*brother;// 指向其下一个兄弟结点

DateTypedate;//存储数据!

}

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

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

......

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

该结构的运用!

voidprintTree(structTreeNode*parent)

{

if(parent==NULL)

    return;

structTreeNode*cur=parent;

while(cur)

{

    printf("%d",cur->date);//先访问当前节点

    printTree(cur->child);//访问自孩子节点

    cur=cur->brother//再访问兄弟节点!

}

}

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

这种方式方便找祖先!

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


相关文章
|
1月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
49 1
|
9天前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
11天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
11天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
1月前
|
存储 算法 测试技术
【初阶数据结构篇】实现顺序结构二叉树(堆的实现方法)
注意传过去的参数是插入的位置,即插入前的size,在调整完后再将size++
|
9天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
13天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
14 0
【数据结构】栈和队列的深度探索,从实现到应用详解
|
1月前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了