❤️【数据结构系列 6】树入门详解(c++版本)❤️

目录

    • 前言
    • 一、树的定义
      • 1、基础概念
      • 2、树的分类
    • 二、二叉树
      • 1、二叉树的基础概念
      • 2、二叉树的分类

前言

系列文章传送门:.
【数据结构系列 1】数组入门详解
【数据结构系列 2】栈入门详解
【数据结构系列 3】队列入门详解
【数据结构系列 4】链表入门详解
【数据结构系列 5】哈希表入门详解
【数据结构系列 6】树入门详解

一、树的定义

1、基础概念

之前介绍的所有的数据结构都是线性存储结构。本文所介绍的树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。
❤️【数据结构系列 6】树入门详解(c++版本)❤️_第1张图片

图 1(A) 是使用树结构存储的集合 {A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意图。对于数据 A 来说,和数据 B、C、D 有关系;对于数据 B 来说,和 E、F 有关系。这就是“一对多”的关系。

将具有“一对多”关系的集合中的数据元素按照图 1(A)的形式进行存储,整个存储形状在逻辑结构上看,类似于实际生活中倒着的树(图 1(B)倒过来),所以称这种存储结构为“树型”存储结构。

1.1 树的结点

  • 结点:使用树结构存储的每一个数据元素都被称为“结点”。
  • 父结点(双亲结点)、子结点和兄弟结点:对于图 1(A)中的结点 A、B、C、D 来说,A 是 B、C、D 结点的父结点(也称为“双亲结点”),而 B、C、D 都是 A 结点的子结点(也称“孩子结点”)。对于 B、C、D 来说,它们都有相同的父结点,所以它们互为兄弟结点。
  • 树根结点(简称“根结点”):每一个非空树都有且只有一个被称为根的结点。图 1(A)中,结点A就是整棵树的根结点。
    树根的判断依据为:如果一个结点没有父结点,那么这个结点就是整棵树的根结点。
  • 叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。例如图 1(A)中,结点 K、L、F、G、M、I、J 都是这棵树的叶子结点。

1.2 子树和空树

  • 子树:如图 1(A)中,整棵树的根结点为结点 A,而如果单看结点 B、E、F、K、L 组成的部分来说,也是棵树,而且节点 B
    为这棵树的根结点。所以称 B、E、F、K、L 这几个结点组成的树为整棵树的子树;同样,结点 E、K、L 构成的也是一棵子树,根结点为 E。

  • 空树:如果集合本身为空,那么构成的树就被称为空树。空树中没有结点。

1.3 结点的度和层次

  • 对于一个结点,拥有的子树数(结点有多少分支)称为结点的度(Degree)。例如,图 1(A)中,根结点 A 下分出了 3
    个子树,所以,结点 A 的度为 3。

  • 一棵树的度是树内各结点的度的最大值。

  • 结点的层次:从一棵树的树根开始,树根所在层为第一层,根的孩子结点所在的层为第二层,依次类推。对于图 1(A)来说,A结点在第一层,B、C、D 为第二层,E、F、G、H、I、J 在第三层,K、L、M 在第四层。

1.4 有序树和无序树

  • 如果树中结点的子树从左到右看,谁在左边,谁在右边,是有规定的,这棵树称为有序树;反之称为无序树。

1.5 森林

  • 由 m(m >= 0)个互不相交的树组成的集合被称为森林。

2、树的分类

根据树的节点数目的不同,我们将树分为二叉树和其他树。
2.1 二叉树:

  • 本身是有序树;
  • 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;

二叉树是使用最多的一类树,后面将会详细介绍,而反观其他类型的树使用的频率较低,这里就暂且统一归为一类——其他树。

二、二叉树

1、二叉树的基础概念

1.1 二叉树的定义
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2i-1个结点;深度为k的二叉树至多有2k-1个结点;对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

1.2 二叉树的性质:

1) 在非空二叉树中,第i层的结点总数不超过2i-1, i>=1;

2) 深度为h的二叉树最多有2h-1个结点(h>=1),最少有h个结点;

3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;   
4) 具有n个结点的完全二叉树的深度为log2(n+1);   
5) 有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
    若I为结点编号则 如果I>1,则其父结点的编号为I/2;
    如果2I<=N,则其左儿子(即左子树的根结点)的编号为2I;若2I>N,则无左儿子;
    如果2I+1<=N,则其右儿子的结点编号为2I+1;若2I+1>N,则无右儿子。   
6)给定N个节点,能构成h(N)种不同的二叉树,其中h(N)为卡特兰数的第N项,h(n)=C(2*n, n)/(n+1)。
7)设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i。

2、二叉树的分类

❤️【数据结构系列 6】树入门详解(c++版本)❤️_第2张图片

2.1 满二叉树

  • 满二叉树

除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。

满二叉树的性质:

  1. 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;
  2. 叶子数为2h;
  3. 第k层的结点数是:2k-1;
  4. 总结点数是:2k-1,且总节点数一定是奇数。

❤️【数据结构系列 6】树入门详解(c++版本)❤️_第3张图片

2.2 完全二叉树

  • 完全二叉树

若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层)
的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。

❤️【数据结构系列 6】树入门详解(c++版本)❤️_第4张图片
2.3 平衡二叉树
又被称为AVL树,它是一颗空树或左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。
❤️【数据结构系列 6】树入门详解(c++版本)❤️_第5张图片

2.4 二叉排序树

二叉查找树是二叉树的衍生概念:二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或二叉排序树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3.任意节点的左、右子树也分别为二叉查找树;
4.没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。
❤️【数据结构系列 6】树入门详解(c++版本)❤️_第6张图片
2.5 红黑树
是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:

1)节点是红色或黑色;
2)根节点是黑色;
3)所有叶子节点都是黑色;
4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

❤️【数据结构系列 6】树入门详解(c++版本)❤️_第7张图片
❤️【数据结构系列 6】树入门详解(c++版本)❤️_第8张图片

❤️ 如果本文对你有所帮助,请不要忘了点赞、关注、收藏哦!灰常感谢! ❤️

你可能感兴趣的:(数据结构,二叉树,数据结构)