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

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

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

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.树在实际中的运用(表示文件系统的目录树结构)


相关文章
|
2月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
63 0
|
1天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
14 2
|
21小时前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
30 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
21小时前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
25 10
|
21小时前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
25 12
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
76 5
|
2月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
70 0
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
255 9
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
41 1
|
21小时前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
24 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
下一篇
开通oss服务