树的定义:

  • 1.树是非线性结构
  • 2.树由唯一的根和若干不想交的子树组成
  • 3.树与图的区别:树中没有一个闭环
    术语:
  • 1.结点:树的数据元素
  • 2.结点的度:结点拥有的子树的个数
  • 3.树的度:各个结点中度的最大值
  • 4.叶子结点:度为0的结点
  • 5.分支结点:度不为0的结点
  • 6.子结点:当前结点的各个子树的根称为当前结点的子结点
  • 7.父结点:结点的上层节点
  • 8.结点的层次:从根节点到某结点路径上的分支数(长度)
  • 9.树的深度:树中结点的最大层次树
  • 10.无序树:各个子结点之间没有顺序(像是从左到右(上下有顺序)没有顺序,能互相替换)
  • 11.有序数:各个结点之间没有顺序关系(像是从左到右有顺序,不能互相替换),例如二叉树(分左右)
  • 12.兄弟:同一个父节点
  • 13.高度:该节点到最远叶子节点的最长路径上的节点数(对于整棵树来说,深度和高度是相同的 )

(一)二叉树

1.普通二叉树

定义:每个节点最多只有两个子节点的树

2.平衡二叉树

定义:一个二叉树的左右两个子树的高度差的绝对值不超过1(除了空树)
类似这样:和完全二叉树相比,平衡二叉树最后一层不必在右边

3.完全二叉树

定义:高度为K的二叉树,其中从除了第k层以外,其他层的结点的度都达到最大个数,并且第k层所有结点都在左边
类似这样:最后一层没满的话结点要在左边

4.满二叉树

定义(国内):除了最后一层(叶子结点)外,其他每个结点的度都达到最大个数
类似这样:

定义(国外):所有结点要么度为0,要么度为2
类似这样:

4.二叉排序树(二叉搜索树)

  1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 它的左、右子树也分别为二叉排序树
    简而言之,是从左到右,左边小,右边大。类似这样:

5.平衡二叉查找树(AVL)

结合了平衡二叉树和二叉查找树特点的二叉树
像是这样:和二叉排序树的区别是二叉排序树不用平衡

6.二叉堆(Treap)

1.堆中某个结点的值总是不大于或不小于其父结点的值
2.堆总是一棵完全二叉树

6.1.最大堆

父结点的键值总是大于或等于任何一个子节点的键值

6.2.最小堆

结点的键值总是小于或等于任何一个子节点的键值。
类似这样:

7.红黑树(Red Black Tree)

二叉查找树的基础上,增加了以下要求:

  • 性质1. 结点是红色或黑色。
  • 性质2. 根结点是黑色。
  • 性质3. 所有叶子都是黑色。(叶子是NIL结点)
  • 性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
  • 性质5. 从任一节结点到其每个叶子的所有路径都包含相同数目的黑色结点。
    相比avl树的旋转次数要少
    最长和最短路径不会相差两倍以上

    类似这样一棵树:

8.节点大小平衡树(SB树)

SBT也是一种自平衡二叉查找树,它的平衡原理是每棵树的大小不小于其兄弟树的子树的大小

他的特点是平衡维护
size:该节点的大小
x:跟结点
l:左边
r:右边
即size(x->l)≥size(x->r->l),size(x->r->r),右边同理size(x->r)≥size(x->l->l),size(x->l->r)

9.伸展树(自适应查找树)

是一种二叉查找树,利用局部性原理设计
(被查频率高的那些节点应当经常处于靠近树根的位置)
如下图:

10.区间红黑树

定义:红黑树的基础上在维护一个自己子孙结点数据的所属区间
如图所示:

11.霍夫曼树(最优树)

名词:
结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权
带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积
该树的带权路径长度达到最小,称这样的二叉树为最优二叉树
特点:权重越大的结点离树根越近
构建一个霍夫曼树
1.在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
2.在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
2.重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树
结构如图所示:

还有一些其他二叉树后续补充

(二)B树

1.B树(B-树)

B树是一种平衡的多叉搜索树
一个m阶B数是空树或者满足以下性质:
1.根节点有至少两个子女;
2.每个非根节点所包含的关键字个数 j满足:┌m/2┐ - 1 <= j <= m - 1 即:
向上取证的(阶数除以2)减一小于等于J小于等于阶数-1(按三阶图就是1<=j<=2)
3.除了根节点和叶子结点以外的所有结点的度数是关键词总数+1
4.所有的叶子结点都位于同一层
简而言之:就是每个节点里有n个关键字的多阶树
像是这样:

2.B+树

B+树是B-树的变体,也是一种多路搜索树
B-树的区别

  • 非叶子结点的子树指针与关键字个数相同;
  • 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);
  • 为所有叶子结点增加一个链指针;
  • 所有关键字都在叶子结点出现;
    类似这样:

3.B*树

B+树的变体,在B+树的内节点(保存索引的结点)再增加指向兄弟的指针
而且非叶子结点*关键字个数至少为(2/3)M(上边俩B树关键字为为┌m/2┐ - 1 <= j <= m - 1)
如图所示:

4.2-3树

1.B-树结构
2.每个非叶结点都有两个或三个子女,并且叶子在同一层(和B树一样)
3.结点有一到两个关键词,当结点有一个关键词, 就有两个子女,有两个关键词的时候,有三个子女
4.父结点一个关键词的时候,左边的子树值<父结点的值<右边的值,父结点两个关键词的时候,左边的子树<父结点第一个关键词<中间的子树<父结点第二个关键词<右边的子树
如图所示:

4.2-3-4树

阶为 4 的B树,道理和2-3树一样
1.每个节点每个节点有1、2或3个关键字,分别称为2(孩子)节点,3(孩子)节点,4(孩子)节点
2.各个结点之间大小关系(以一个四个孩子结点的父结点为例子,从左右到的关键字为key0/1/2,从左右到的子结点为c0/1/2/3)
c0的子树的所有子节点的关键字值小于key0;
c1的子树的所有子节点的关键字值大于key0并且小于key1;
c2的子树的所有子节点的关键字值大于key1并且小于key2;
c3的子树的所有子节点的关键字值大于key2
如图所示:

此外还有H树,Dancing tree,(a,b)-树等等资料较少,后续找到了在补

(三)字典树

字典树主要用于字符串排序和查询之类的,核心思想为空间换时间

1.前缀树

性质
1.根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
3.每个节点的所有子节点包含的字符都不相同
以下就是构建b,abc,abd,bcd,abcd,efg,hii 这6个单词单词的例子:

2.后缀树

对于一个字符串str[0,n),只要将str[0,n),str[1,n),str[2,n),str[3,n),…,str[n-1,n)依次切割
例如“MISSISSIPPI“”切割后可以得到

MISSISSIPPI
ISSISSIPPI
SSISSIPPI
SISSIPPI
。。。。。。等等

然后用这些切割后的单词组成一棵树
如图所示:

然后,将只有一个子节点的向上或者向下合并得到如下图所示:

这样的树就是后缀树

3.基数树

基数树是将指针与long整数键值相关联的机制(每一个结点是一个k:v形式)
每个值有一个key为log,分配机制也是基于该key;

比如key=0X12345678一棵树的如下图所示:
遇见0就走左边,1就走右边

(四)空间划分树

以下这些树通常是用来表示二维或者三维的空间使用

1.四叉树

四叉树是一种每个节点最多有四个子树的数据结构
四个点作为四个坐标可以构建出来一个矩形,寻找一个矩形根据其范围寻找即刻

2.八叉树

四叉树的更高维度,三维的表示
加了一个高度层面,2^3是八,所以是八叉树

3.K-D树

对数据点在k维空间种划分的数据结构,每一个节点是一个多维坐标
核心理念是根据不同维度二分查找
比如一个区域:

第一层:按照X维度划分,划分点是(7,2),左子树都要在X维度比(7,2)小,也就是x<7。也就是,左子树都在(7,2)这个点的左边。右子树都在(7,2)这个点的右边
第二层:按照Y维度划分,划分点是(5,4),他的左子树在Y维度上都要比(5,4)小,也就是y<4

以此类推。。就可以把整个平面划分成很多个小平面。

构造成树:

4.R树

给地理位置,矩形和多边形这类多维数据建立索引用的
R树的一个简单实例:

在一个矩形空间中
从叶子结点开始用矩形(rectangle)将空间框起来,结点越往上,框住的空间就越大;
框住该矩形的就是他的父结点
理念有点想地图,什么省(内节点)什么市(内节点)什么县(叶子节点)

4.R+树

和R树的区别如图所示

R树是可以重叠的
而R+树

则是将重叠部分新分出来一个,从而从P直接可以查到H

4.R*树

和R树的构造相同,增删改查也基本相同,区别在于:
1.插入路径
R树只考虑了目录矩形的面积这一因素,R* 树除了考虑面积以外。还考虑了目录矩形的重叠。
2.除了采用面积指标以外,同时引入周长和重叠面积部分作为判定指标
3.强制重新插入算法
R*树提出了对索引中已有结点中的单元进行有选择的重新的插入,以优化R树的整体结构。

未完待续。。。

数据结构(3)常见的树相关推荐

  1. STL剖析(二):容器底层数据结构及常见用法

    一.概述 本文主要聚焦于STL容器,STL完整的容器分类体系如下所示,下文将逐一对各个容器底层的数据结构以及常见用法进行介绍. 测试环境:Ubuntu 22.04 g++ 11.3.0 二.顺序容器 ...

  2. 心中有“树”!图文并茂介绍数据结构中常见的树(二)

    计算机科学家尼古拉斯·沃斯(Niklaus Wirth)曾说过:编程=数据结构+算法 ,可见数据结构在编程中的重要性. 50 年过去了,计算机行业日新月异,大佬的这句名言是否还适用于当下?使用成熟且丰 ...

  3. 心中有“树”!图文并茂介绍数据结构中常见的树(三)

    在前面两篇文章中,我们简要介绍了数据结构中的各种[树]在搜索.数据库等领域的使用场景,希望对大家有所帮助. 本篇内容,是我们 <心中有"树"> 系列的最后一篇,我会在这 ...

  4. 数据结构与算法——AVL树类的C++实现

    关于AVL树的简单介绍能够參考: 数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额 ...

  5. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...

  6. 数据结构与索引-- B+树索引

    B+树索引 上一节中我们讨论的都是B+树的数据结构的由来以及他的一些操作,B+树索引在本质就是B+树在数据库中的一个实现,但是B+索引在数据库中有一个特点就是他的高扇出性,因此在数据库中,B+树的高度 ...

  7. 数据结构与算法--B树原理及实现

    B树 前几篇文中讨论的数据结构我们都是假设所有的数据都存储在计算机的主存中.可说总要那么海量的数据需要通过个中数据结构去存储,我们不可能有这么多内存区存放这些数据.那么意味着我们需要将他们放磁盘.所以 ...

  8. 数据结构---判断一棵树是否是二叉搜索树

    数据结构-判断一棵树是否是二叉搜索树 代码: #pragma once #define N 100 #define elemType BTree* #include<stdlib.h> t ...

  9. 数据结构---二叉线索树

    数据结构-二叉线索树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct bmTree {i ...

  10. 数据结构---哈夫曼树

    数据结构-哈夫曼树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 100 #define INF ...

最新文章

  1. C语言中浮点型在计算机中的存储
  2. YY/T 0664—2020《医疗器械软件 软件生存周期过程》 相关
  3. CF496E-Distributing Parts【平衡树,贪心】
  4. 约瑟夫问题公式及代码实现
  5. C#面向对象系列(2):构造函数的用法
  6. 滴滴顺风车回归倒计时!
  7. SQL中WHERE子句介绍
  8. CSS3实现轮播图效果
  9. 2019-05-22 Java学习日记 day12
  10. Atitit gui界面ui技术发展史与未来趋势
  11. python的metaclass分析
  12. vnc远程控制软件中文版,4款好用的vnc远程控制软件中文版
  13. 一个有意思的需求——中文匹配度
  14. 放生主要体现在对生命尊严的维护
  15. Ubuntu-安装汉语拼音输入法
  16. Linux 之父:林纳斯·托瓦兹(Linus Torvalds)
  17. 如何修改文件的扩展名(后缀)
  18. 【微信开发】---- 公众号支付
  19. SINS_Kalman
  20. 大学生python实验心得体会_最新大学生实验心得体会范文汇总

热门文章

  1. 深入学习理解java虚拟机--1.win10 下构建64位 openJDK8
  2. PS作业 不一样的我
  3. ps平面设计作业_海报设计
  4. java响应式交友网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  5. 数组中a与a[0]的区别
  6. activity 所需jiar包
  7. 软件缺陷报告与JIRA工具使用学习笔记
  8. 微信添加地址时选择地区功能是怎么实现的
  9. 外置USB供电与内置锂电池供电自动切换电路,便携电子设备常用,经典电路必须掌握...
  10. JavaScript中数组的几种写法