1.树的概念
树是一种
非线性
的数据结构,它是由
n
(
n>=0
)个有限结点组成一个具有层次关系的集合。
把它叫做树是因
为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
节点的度
:一个节点含有的子树的个数称为该节点的度;
叶节点或终端节点
:度为
0
的节点称为叶节点;
非终端节点或分支节点
:度不为
0
的节点;
双亲节点或父节点
:若一个节点含有子节点,则这个节点称为其子节点的父节点;
孩子节点或子节点
:一个节点含有的子树的根节点称为该节点的子节点;
兄弟节点
:具有相同父节点的节点互称为兄弟节点;
树的度
:一棵树中,最大的节点的度称为树的度;
节点的层次
:从根开始定义起,根为第
1
层,根的子节点为第
2
层,以此类推;
树的高度或深度
:树中节点的最大层次;
堂兄弟节点
:双亲在同一层的节点互为堂兄弟;
节点的祖先
:从根到该节点所经分支上的所有节点;
子孙
:以某节点为根的子树中任一节点都称为该节点的子孙。
树的表示
(孩子兄弟表示法)
typedef
int
DataType
;
struct
Node
{
struct
Node
*
_firstChild1
;
//
第一个孩子结点
struct
Node
*
_pNextBrother
;
//
指向其下一个兄弟结点
DataType _data
;
//
结点中的数据域
};
![](https://img-blog.csdnimg.cn/ba605f92792f43cfb0ccafad7a27207f.png)
2.二叉树
一棵二叉树是结点的一个有限集合,该集合
:
1.
或者为空
2.
由一个根节点加上两棵别称为左子树和右子树的二叉树组成
特殊的二叉树
1.
满二叉树
:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
说,如果一个二叉树的层数为
K
,且结点总数是
,则它就是满二叉树。
2.
完全二叉树
:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为
K
的,有
n
个结点的二叉树,当且仅当其每一个结点都与深度为
K
的满二叉树中编号从
1
至
n
的结点一一对
应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
3,二叉树的存储结构
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
1.
顺序存储
顺序结构存储就是使用
数组来存储
,一般使用数组
只适合表示完全二叉树
,因为不是完全二叉树会有空
间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。
二叉树顺
序存储在物理上是一个数组,在逻辑上是一颗二叉树。
![](https://img-blog.csdnimg.cn/5ec6c14a95d948a6be7b686cc2811902.png)
2.
链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是
链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所
在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程
学到高阶数据结构如红黑树等会用到三叉链。
![](https://img-blog.csdnimg.cn/3fbe118ba3d24c7ab2a05d0f00107be8.png)
4.二叉树的遍历
按照规则,二叉树的遍历有:
前序
/
中序
/
后序的递归结构遍历
:
1.
前序遍历
(Preorder Traversal
亦称先序遍历
)——
访问根结点的操作发生在遍历其左右子树之前。
2.
中序遍历
(Inorder Traversal)——
访问根结点的操作发生在遍历其左右子树之中(间)。
3.
后序遍历
(Postorder Traversal)——
访问根结点的操作发生在遍历其左右子树之后。
层序遍历
:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在 层数为1
,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第
2
层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。