在介绍完数据结构的顺序表之后,接下来着手开始树的介绍树的相关内容;而因为篇幅,本次只会牵扯到树的基本概念以及二叉树的相关介绍,代码则基本不涉及!
树是一种非线性的数据结构,它是由n个(n>=0)有限结点组成的一个具有层次关系的集合。
如图所示:
这就是一个树,因为倒着看就如同树一般,因此形如这种数据结构就被称为树!
因此,如上图所示,A为根节点,无前驱,绿色、蓝色、紫色为3棵子树,当然子树的划分并不只有这些,我是以A为根节点进行划分的,向下还是可以划分其他小规模的子树的。
而树的结构中是不能存在交集的,否则就不是树形结构
这种结构是错误的!
需要注意的是:
以上就是数结构中各个位置的含义,而黄色标记的就是较为重要的,在之后的编程中或许会出现。
1️⃣
typedef struct TreeNode
{
struct TreeNode* leftchild;
struct TreeNode* rightchild;
DataType data;
}TreeNode;
其结构可以这样表示出来:
与链表很类似,利用结构体指针去指向下一个结构体或者说是下一个树的结点,当然这只是一种表示方法;
2️⃣
typedef struct TreeNode
{
struct TreeNode* child;
struct TreeNode* brother;
DataType data;
}TreeNode;
这也是一种表示方法,当然树的表示方法有很多,我认为第一种是最好的,便于理解,且操作简单,在下面的操作中也大都会使用第一种方式进行编码;
在有了前面内容的铺垫,理解二叉树就更为简单。
大自然给出我们的二叉树:
一棵二叉树是结点的一个有限集合
要么为空
要么由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
概念总是看的人想吐,接下来看一个实际结构就可以很快了解到二叉树了:
从上图可以看出:
一个二叉树,每一层的结点数都达到最大值,则这个二叉树是满二叉树。
每一层都被结点填满,没有空隙,像这样的树就被称为满二叉树;满二叉树的总结点数为(2^i-1),这个会在下面进行推导。
完全二叉树:完全二叉树是由满二叉树引申出来的一种效率很高的数据结构;而完全二叉树其前k-1层是满的,第k层从左到右连续,当第k层结点满时,此时完全二叉树也就是一个满二叉树。
其实在接下来介绍的结构堆,就是一棵完全二叉树,会利用完全二叉树的各种性质从而实现堆排序以及解决TopK问题。
这一性质对应于性质2,最多结点也就意味着是一个满二叉树,所以对其进行数学变换就可以得到满二叉树的高度!
(1)若左孩子的编号为i,则其父节点的下标为2i+1;
(2)若右孩子的编号为i,则其父节点的下标为2i+2;
(3)(孩子结点下标-1)/ 2 = 父节点下标
上述三点很重要!!!在堆排序中会进行应用!!!
本次博客就结束了,关于二叉树的基础内容就这么多,其较为重要的我大都也进行了标识,后续会进行二叉树的编写以及堆的编写。
就这样吧🙋♂️🙋♂️🙋♂️