本文重点知识:树相关概念,二叉树基本知识
前言
前面博客重点讲解了顺序表,链表,栈和队列等等线性数据结构,今天我们开始讲解难度更大的一个内容,就是另外一种数据结构,叫做树,和之前那些数据结构不同,之前的数据结构都是线性数据结构(除了头和尾,每一个元素都有一个前驱和一个后继),而今天讲的树则是非线性结构~
树的概念和结构
既然这种数据结构叫做树,那肯定是和现实中的树有关系的~,不错,数据结构中的树就是把现实中的树倒挂了起来~, 根是朝上的,叶子是朝下的~
划重点!!! 数据结构中 树 是按照 现实中的树 + 人类亲缘关系来定义的~
显然A就是根节点,而A分支出去的各个分支形成的结构我们可以看成是A的子树(下图中红笔圈出来的都是A的子树),而A分出去的各个节点就相当于人类血缘关系中的孩子一样,可以认为B,C,D,E,F,G都是A的孩子~,都叫子节点~
下面是一系列和树相关的概念~
![](https://i-blog.csdnimg.cn/blog_migrate/b6a4b586137a30f5c6c4a96c25eba56e.png)
关于树要说明的几个点
![](https://i-blog.csdnimg.cn/blog_migrate/8fdd11baf20b95f8f9cf200c21fc086e.png)
③除了根节点外,每一个节点只有一个父亲(和亲缘关系是一模一样的~)
树的表示
用代码实现树有不少种写法,比如说:
1.明确了树的度就可以定义
2.用顺序表存储孩子
3.双亲表示法(每个位置只存双亲的指针或者下标)
4.左孩子右兄弟表示法(最优结构)
每个节点是个结构体,结构体中有三个成员变量,第一个存放数据,第二个存放指向第一个孩子节点的指针,第三个存放指向自己亲兄弟节点的指针,因此叫左孩子右兄弟表示法~
左孩子右兄弟表示法极大的简化了树的定义~
树的应用
树的一个重要应用是目录树~
电脑磁盘中存放文件夹就用到了树的存储结构~~~
二叉树相关概念
···二叉树:
概念: 度<=2的树就叫做二叉树,也就是说每个父亲最多两个孩子~,下面这些树都是二叉树~
任意二叉树都是由以下情况复合而成
···满二叉树
即每层都是满的,每个父亲都有两个孩子
···完全二叉树:
假设完全二叉树的高度是h(有h层)
则完全二叉树的特点是:前h-1层都是满的,第h层可以不满,且最后一层从左到右是连续的~
注意:第h层可以不满,也可以满,若第h层满了,则该完全二叉树就是满二叉树,因此我们说满二叉树是特殊的完全二叉树~
二叉树节点个数
假设二叉树高度为h,即有h层!
满二叉树节点总个数:2^h-1
显然,节点总个数为 2^0 + 2^1 + ·······+2^(h-1),根据等比数列求和公式,得节点总个数为2^h-1
完全二叉树节点范围:[2^(h-1), 2^h-1]
显然完全二叉树的节点个数是一个范围,最多就是满二叉树节点个数,为2^h-1
节点最少的情况就是前h-1层是满的,第h层只有一个节点(因为前提是完全二叉树有h层),这时可以看成前h-1层是满的二叉树+最后一层的一个节点~
满二叉树2^h-1中h替换成h-1,再+1得到完全二叉树节点最少是2^(h-1)个
二叉树的存储结构
我们所说的二叉树其实知识一种逻辑结构,就和之前讲解单链表时箭头是假想出来的一样,研究二叉树的存储结构也就是研究二叉树在内存中的物理存储结构~
二叉树的存储结构有两种:顺序结构和链式结构~
1.顺序结构
普通二叉树并不适合用数组来存储,因为存在着大量的空间浪费,而完全二叉树尤其适合用数组存储~~~
①完全二叉树存储
②普通二叉树存储
如果数组中挨个存储二叉树数据,那么父子下标关系就全乱了,如果按照完全二叉树的形态存储,会造成大量空间的浪费~,因此只有完全二叉树适合用数组存储~
2.链式结构
①二叉链
②三叉链
树的基本知识就介绍到这了,欲知后事如何,且听下回解说~