目录
- 前言
- 一、树
- 1、树的相关概念
- (1)结点
- (2)结点的度
- (3)叶结点
- (4)分支结点
- (5)父亲结点
- (6)子节点
- (7)树的度
- (8)结点的层次
- (9)树的深度(高度)
- (10)结点的祖先
- (11)子树
- 2、树的表示方法
- 二、二叉树
- 1、特殊的二叉树
- (1)满二叉树
- (2)完全二叉树
前言
前面我们学习的都是一些线性的数据结构,比顺序表,链表,栈和队列,逻辑结构比较简单,今天我们重点学习的是一种非线性的数据结构,就是树形结构。
一、树
在现实生活中我们都看到过树,如下图,所以对树的形状会有一个基本的认知
但是在数据结构这门课中我们学习的树可就不是长上面这个样子了,而是下面这个奇怪的样子:
1、树的相关概念
(1)结点
每一个树都是由一个个小小的单元组成,在数据结构中,我们将这样的小单元称为结点。
像上面ABCDEF都是这棵树的结点。
(2)结点的度
每一个结点都是相当于一棵子树的根,而根又会有很多的分支,在数据结构中,一个结点有多少个分支,我们就说这个结点的度为多少。比如:
像上面这个图中,A这个结点有三个分支,就说明A的度为3。E和F这两个结点没有分支,我们就说这两个结点的度为0。
(3)叶结点
我们将度为0的结点称为叶子结点,或简称为叶节点。如下图中的EF结点度为0,所以它们为叶节点。
(4)分支结点
与叶子结点相反,度不为0的结点我们称为分支结点,如下图中AC结点的度不为0,所以AC结点为分支结点。
(5)父亲结点
如果一个结点含有分支,也就是包含子树,则我们将这个结点称为其子树的父亲结点或双亲结点,后面我们是用parent来表示。如下图中的A结点有三个分支BCD结点,所以我们成A结点是BCD结点的父亲结点。
(6)子节点
一个结点含有的子树的根结点我们称为这个结点的子节点,就是我们要知道一个子树是由自己的根节点和另外的子树构成的。下图中:A包含BCD三个子树,BCD三个结点分别为对应子树的根节点,所以我们成BCD结点为A结点的子节点,后面我们是用child来表示。
(7)树的度
一棵树中所有结点中度最大的结点的度我们称为这棵树的度,下图中:显然A结点的度最大,是3,所以我们说这棵树的度为3。
(8)结点的层次
从这棵树的根节点开始定义,我们说根结点是第一层,其子树的根节点为第三层,以此类推。下图中:A为第一层,BCD为第二层,EF为第三层。
(9)树的深度(高度)
一棵树最大的层次就是这棵树的深度(高度),如下图中:这棵树的最大层次为3,所以我们说这棵树的深度(高度)为3。
(10)结点的祖先
从根到该节点所经分支上的所有结点都称为该节点的祖先,注:在OJ题中一个结点也可以算成其自己的祖先。如下图中:从A到E,经历了ACE,所以我们成ACE结点都是E结点的祖先。
(11)子树
任意一个结点都可以说是由根节点和其自己的子树组成
2、树的表示方法
上面介绍的树是树中的一种特殊的结构,二叉树,二叉树中每个节点的度最大为2,但是树就不一样了,树中的每一个结点的度是不确定的,可多可少。所以表示起来会比较麻烦,在这里我们学习一种比较优秀的表示方法:孩子兄弟表示法,这个方法需要和前面学习的链表结合起来,首先需要定义树中结点的结构
// 定义树存储的数据类型
typedef int TreeDataType;
// 定义一棵树的结点的结构
struct TreeNode
{
TreeDataType data;
struct TreeNode* first_child;
struct TreeNode* next_brother;
};
其中data表示结点存储的值,first_child指向的是该节点的第一个孩子,next_brother指向的是该节点向右的下一个结点,我们称为兄弟结点。如下图:
二、二叉树
一棵树中,如果每一个结点的度都不超过2,则称这棵树为二叉树。二叉树中的孩子结点是有左右之分的,位于左边的结点称为左孩子结点,位于右边的结点称为右孩子结点,子树同样也有左右之分,位于左边的称为左子树,位于右边的称为右子树。
1、特殊的二叉树
(1)满二叉树
如果每一层的结点都达到最大值,则我们称这棵树为满二叉树,如:一棵树中,第一层是根节点,最多只有一个结点,第二层最大有两个结点,第三层最多有四个结点,第四层最多有8个结点,以此类推,第N层最多有2^(N-1)个结点,如下图就是一棵满二叉树。
(2)完全二叉树
满二叉树是一种特殊的完全二叉树,完全二叉树的特点是:如果这棵树有N层,前N-1层的结点树都是达到对应层的最大值,最后一层可能达到最大,也可能未达到最大,但是从左到右是满的