数据结构(3)常见的树

树的定义:

  • 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树的整体结构。

未完待续。。。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值