数据结构:详解二叉树(树,二叉树顺序结构,堆的实现与应用,二叉树链式结构,链式二叉树的4种遍历方式)

目录

1.树的概念和结构

1.1树的概念

1.2树的相关概念

1.3树的代码表示

2.二叉树的概念及结构

2.1二叉树的概念

2.2特殊的二叉树

2.3二叉树的存储结构

2.3.1顺序存储

2.3.2链式存储

3.二叉树的顺序结构和实现

3.1二叉树的顺序结构

3.2堆的概念和结构

3.3堆的特点

3.4堆的代码实现

3.4.1堆代码实现中的算法问题

3.4.1.1向上调整算法

3.4.1.2向下调整算法

3.4.2堆代码 Heap.h

3.4.3堆代码Heap.c

3.4.4堆代码test.c

3.5堆的应用(TOP K问题)

3.5.1举例

3.5.2解决问题代码

4.二叉树的链式结构和实现

4.1手搓链式二叉树

4.2遍历链式二叉树

4.2.1前序遍历

4.2.2中序遍历

4.2.3后序遍历

4.2.4层序遍历

​编辑

4.3链式二叉树的其他函数

4.3.1二叉树节点个数,叶子节点个数,高度函数

4.3.2二叉树第K层节点个数

4.3.3销毁二叉树


1.树的概念和结构

1.1树的概念

树与我们之前学过的数据结构都不相同,因为其具有一个重要特征:非线性

树是一种非线性的数据结构,由一组节点(node)和一组连接节点的边(edge)组成。树的基本定义如下:

  1. 每个树都有一个称为根(root)的节点,根节点是树的顶层节点,没有父节点。
  2. 除了根节点外,每个节点可以有零个或多个子节点,子节点与父节点之间通过边连接。
  3. 树中的每个节点都有一个称为父节点(parent)的节点,除了根节点。
  4. 树中的节点可以拥有一个或多个子节点,每个子节点都有一个称为子树(subtree)的树,由该子节点及其子节点构成。
  5. 没有子节点的节点称为叶节点(leaf),叶节点位于树的底层。
  6. 从根节点到任意节点的路径都唯一确定一条边,该边称为该节点的父边。

 用图来表示就是:

简单来说,数据结构中树就是一种发散性的结构,与我们之前学过的单链表,顺序表,栈和队列这类的线性事物完全不同。计算机中和树有关系的就是文件夹,文件夹一般采用多层次结构( 树状结构 )。在这种结构中每一个磁盘有一个根文件夹 ,它包含若干文件和文件夹。

需要注意的一点是: 在树这种结构,子树之间不能有交集,要不然就不能构成树了。

1.2树的相关概念

在树这种数据结构中包含了很多概念,这些概念基于树的结构,利用人类亲缘关系和树木的概念名称命名。

结点的度:一个结点含有的子树的个数称为该结点的度;如上图:A的为6
叶结点或终端结点:度为0的结点称为叶结点;如上图:B、C、H、I...等结点为叶结点
非终端结点或分支结点:度不为0的结点;如上图:D、E、F、G...等结点为分支结点
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;如上图:A是B的父结点
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;如上图:B是A的孩子结点
兄弟结点:具有相同父结点的结点互称为兄弟结点;如上图:B、C是兄弟结点
树的度:一棵树中,最大的结点的度称为树的度;如上图:树的度为6
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
树的高度或深度:树中结点的最大层次;如上图:树的高度为4
堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点
结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林;

1.3树的代码表示

树的代码表示和一些其他数据结构类似,都是利用指针联系不同的数据。而树这个数据结构特殊之处在于是由一个根数据慢慢扩展至很多其他数据。从前面的介绍我们也得知了不同数据之间大体上可以分为两种:父子(祖先)关系和兄弟关系,聪明的发明者就是利用这一点设计出了树的代码表示:

typedef int DataType;
typedef struct Node
{
 struct Node* firstChild1; // 第一个孩子结点
 struct Node* pNextBrother; // 指向其下一个兄弟结点
 DataType data; // 结点中的数据域
}Node;

注意:第一个孩子默认是父亲向下最左边的子树。

无论父亲有多少孩子节点,child指向左边第一个孩子。

通过这个设计思路我们能从根出发找到任意一个子树,下面是举例:

(1)


要找到D首先利用(第一个孩子节点指针)找到B,再利用(指向下一个兄弟指针)两次找到D。

(2)


同理,找到L应该走下面这个路线。具体过程不再重复。

2.二叉树的概念及结构

2.1二叉树的概念

二叉树是一种常见的树状数据结构,它由一组称为节点的元素组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。根节点是树的顶部节点,它没有父节点,而其他节点都有且只有一个父节点。

二叉树是树中比较特殊的一种,因为二叉树中每个父节点最多只能有两个子树(左子树和右子树)。

从这张图中我们知道:

1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2.2特殊的二叉树

实际应用中不是所有的二叉树我们都研究,主要有下面两种特殊的二叉树:

1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 2^k-1 ,则它就是满二叉树。
2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。 要注意的是 满二叉树是一种特殊的完全二叉树.

2.3二叉树的存储结构

二叉树的储存结构有两种,正好对应之前我们学过的两种数据结构:顺序表(底层是数组)和链表(底层是结构体和指针)。所以,二叉树储存分为顺序存储和链式存储。

2.3.1顺序存储

顺序存储一般只适用于完全二叉树,因为使用顺序存储要利用到数组。而使用数组存储二叉树就必须要用到完全二叉树(因为这样会满足一定的规律,后续会详细讲),所以使用非完全二叉树时会造成数组空间的浪费(有时需要跳过数组中的一些元素)。如下图:

假设4位置是空的,数组中E位置就必须空出来,这样就造成了空间的浪费。

2.3.2链式存储

3.二叉树的顺序结构和实现

3.1二叉树的顺序结构

二叉树的顺序结构是指将二叉树的节点按照顺序存储在一个数组中,同时利用数组索引来表示节点之间的父子关系。

具体而言,假设二叉树的根节点存储在数组索引为0的位置,任意节点在数组中的索引为i,则它的左子节点存储在索引2i+1的位置,右子节点存储在索引2i+2的位置。这种方式可以有效地节省空间,但在插入和删除节点时可能需要进行数组的移动操作,因此不适用于经常需要插入和删除操作的情况。

在用数组存储的时候根部用0表示,每个子树都要-1.这样就满足前面所说的:

左子树=父亲*2+1;右子树=父亲*2+2.

3.2堆的概念和结构

在数据结构中,堆(Hea

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值