
--树是一种非线性的数据结构,它是由n(n>=0)个有限的节点组成的一个具有关系层次的集合。
:形象的来看,因为它看起来像一颗倒挂的树,它的树根朝上,叶子朝下。


注意:树形结构,子树之间不能有交集。


--说明:
概念比较多,但是对照图理解比较容易。
--从上面的图片可以看出:树的结构很复杂,它存储表示就很麻烦。
--实际使用的表示方法有多种,比如:
--但是最常用的是——>孩子兄弟表示法
//树的结构--孩子兄弟表示法
struct TreeNode
{
struct TreeNode* child; // 左边开始的第⼀个孩⼦节点
struct TreeNode* brother; // 指向其右边的下⼀个兄弟节点
int data; //节点中的数据域
};--图解:

--顺着节点的孩子节点、兄弟节点就可以将所有的子节点找到。
--文件系统是计算机存储和管理文件的一种方式,利用树形结构组织和管理文件及文件夹。在文件系统中,树结构的运用十分广泛,通过父节点和子节点之间的关系来表示不同层次文件之间的关联


--在树形结构中,如果直接使用太复杂。比较常用的一般是二叉树,一颗二叉树是节点的一个有效集合,该集合由一个根节点以及两颗分别称为“左子树”和“右子树”的二叉树组成或者组成为空。
根据图来理解这段话:

--由图知,二叉树有几个特点:
--注意:二叉树的组成情况,有以下几种:

--“满”联系二叉树的特点,即每个节点的子节点都达到最大值(2个节点)。
图示:

其中得到: --每层的节点个数的通式 --> 2^(k - 1); --树的高度k,节点总和 --> 2^(k) - 1;
--完全二叉树是由满二叉树引出的,完全二叉树最后一层可以不满,但节点必须从左到右连续填充的二叉树。
图示:

--根据满二叉树的结构,说明满二叉树是一种特殊的完全二叉树。

--由满二叉树得;
(2、3条,公式互相转换)
--由完全二叉树得:
--二叉树一般使用两种结构进行存储,一种是顺序结构,另一种是链式结构。
--顺序结构存储是使用数组来存储,一般数组只适合表示完全二叉树。不是完全二叉树会有空间浪费。
请看图:

:可以说,数组的填充是为了再现二叉树的结构(或者二叉树是根据数组画出的),所以尽管有的节点为空(图中红色节点),但在数组中也要留出位置,说明在二叉树中这个节点是空的。
--是用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个节点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。
--链式结构又分为二叉链和三叉链,当前学习的二叉树一班是二叉链。
图示:



回顾: 【面试高频数据结构(五)】--《手把手实现栈结构:附带完整代码与注释,深度揭秘数组实现香在哪?》 【面试高频数据结构(六)】--《从初始化到销毁:手把手教你打造健壮的队列实现》
结语:至此,我们已经打下了坚实的“树”形基础。从根到叶的每一部分,都是我们探索更复杂结构的起点。接下来,当我们深入二叉树、堆等森林深处的宝藏时,你会发现,这里定义的每一个术语,理解的每一种特性,都将成为我们手中的利剑。