导航

C++数据结构——树(基础知识篇)

Posted on 2020-11-04 19:55  sealong  阅读(3513)  评论(0编辑  收藏  举报

目录
C++数据结构——树(基础知识篇)

  1. 简介

  2. 基本结构

  3. 基础知识
    3.1 术语
    3.2 树的表示方式
    3.3树的分类

  4. 树的遍历

  5. 简介
    ​ 树是数据结构中的重点,也是我们学习数据结构这门课程中的难点,接下来我们会先来介绍一下树这种数据结构中的一些基础知识,为我们后面的学习打下基础。
    本篇博客不涉及代码实现,只有理论知识,所有的代码实现会另起篇幅。

  6. 基本结构

一棵树是N个节点和N-1条边的集合,其中一个节点叫做根节点,每条边都将某个节点连接到它的父亲,而除去根节点外每个节点都只有一个父亲,每个子节点之间互不相交。
3. 基础知识
3.1 术语
1.节点的度:节点的子节点(子树)个数。例如上图中:节点2的度为3,因为它有456三个子节点。
2.树的度:树中节点的最大的度。
3.叶子节点:度为0的节点。上图中节点45678都是叶子节点
4.父节点:顾名思义,当前节点的父亲,就像人际关系一样,例如:节点1是节点2和节点3的父亲。子节点,祖父节点,兄弟节点等等之类的以此类推就行了。
5.路径和路径长度:路径是一个节点序列,是多个节点的集合,而路径的长度为路径所包含的边的个数,例如:从节点1到节点4的路径为1-2-4,路径长度为2。
6.节点的层次:规定根节点在第一层,其他的节点层次是其父节点的层次+1。
7.树的深度:树中最大的层次就是树的深度。
8.树的高度:与深度相反,高度的第一层是深度的最后一层,树的高度与深度一致(深度是从上往下数,高度是从下往上数)
3.2 树的表示方式
树有基本的三种表示方式,分别是双亲表示法、孩子表示法、孩子兄弟表示法。
由于双亲表示法和孩子表示法局限太大而且不常用(有兴趣的读者可以自己去查阅一下其他资料),我们重点介绍一下孩子兄弟表示法。

又是这张图,我们已经很清楚图中各个节点之间的关系了,而这种树的子节点个数并不统一,有两个的有三个的,这样我们在创建结构体(类)的时候会十分困难,那么有没有一种方法可以让他们的结构统一起来呢,这就是我们的孩子兄弟表示法的由来。我们把它稍微变一下,它就变成了这样:

我们会发现经过转换,他们的子节点至多有两个(也就是整棵树的度为2),分别表示他们的孩子和兄弟,而且这种转换并不会使关系混乱,例如节点2是节点4的父节点,而456三个节点是兄弟节点,说明456都是2的孩子,我们通过这种方式把普通的树转换成为了一颗二叉树(度为2的树)
3.3树的分类
​ 二叉树:二叉树是一颗树,其中每个节点都不能多于两个儿子
​ 满二叉树:除了叶子节点,每个节点的度都是2
​ 完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
​ 至于其他的高级树形结构我们以后的文章在单独列出。
4. 树的遍历
树有四种遍历方式,分别是先序、中序、后序、层次遍历。
先序、中序、后序遍历是以根节点的遍历顺序作为依据:
先序遍历的顺序是根节点--->左子树--->右子树,中序是左根右,后序是左右根
我们以下面的这张图为例

它的先序、中序、后序遍历顺序分别是:
12453678、42513768、42578631
层次遍历最简单:12345678就是层次遍历的顺序了,按照从上到下,从左往右。