Java版高级数据结构二叉搜索树&红黑树

Posted chenry777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java版高级数据结构二叉搜索树&红黑树相关的知识,希望对你有一定的参考价值。

二叉搜索树和红黑树相关代码: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%26%E7%BA%A2%E9%BB%91%E6%A0%91

一、二叉搜索树(二叉排序树)

二叉搜索树又叫二叉查找树,二叉排序树;它具有以下特点:

1.如果它的左子树不为空,则左子树上结点的值都小于根结点。

2.如果它的右子树不为空,则右子树上结点的值都大于根结点。

3.子树同样也要遵循以上两点

为什么又叫做二叉排序树呢? 二叉树的遍历方式分为:前 中 后 层次遍历(mysql

只要一颗树是二叉搜索树,那么它的中序遍历一定是有序的,遍历顺序:左、根(输出)、右

看下边的这颗二叉树,它的中序遍历为:左根右

左 根(输出) 右:0 3 4 5 6 8

二、二叉搜索树的增删改查

1.查找的时候每次都是和根节点比较,一直找到对应的节点值为止。查找的时间复杂度:log(n)

2.插入的时候每次都是和根结点比较。一直要找到它应该插入的位置。插入一定肯定会插在叶子结点。那么其实可以看到,插入其实就是查找。插入n个节点的时间复杂度:nlog(n)

3.删除是要分三种情况,

  • 要删除的结点是叶子结点,查找到后直接删除即可,时间复杂度: O(1)

  • 要删除的结点只有一个子树(左或者右),直接删除后移动子节点指针,时间复杂度:O(1)

  • 要删除的结点有两颗子树:这时候需要找目标节点的后继结点,用后继节点和目标节点做交换,其中找到的后继结点的左子树一定为空,因为找后继节点的过程需要遍历整棵树,所以时间复杂度增长到:O(log(n))

补充知识:

  • 后继节点:节点右分支下第一个比根节点大的数(大的差值的最小),或者可以理解成中序遍历下的下一个值

  • 前继节点:节点左分支下第一个比根节点小的数(小的差值的最小),或者可以理解成中序遍历下的上一个值

三、二叉搜索树的特点

如果一颗二叉搜索树是上图形式,那它就意味着退化成了链表,遍历它的时间复杂度也级从O(log(n))退化成了O(n),为了克服这种问题,我们需要对树进行"整型",让他的左右两端高度维持一个我们可以接受的差值。

平衡二叉树(平衡二叉搜索树)就是为了克服这个弊端而诞生的,通过平衡左右两端的高度,使树的总高度尽可能的低,从而最大化降低整棵树的时间复杂度。

理论上的平衡二叉树,也就是绝对的平衡二叉树,叫AVL树,它的左右层数相差在1以内,但是为了维持这一高度差,需要在整形上付出的时间复杂度代价过大,所以实际实现上我们一般用的多的是非绝对平衡的二叉树——红黑树。

四、红黑树

红黑树的: 对二叉查找树做了类平衡操作后的红黑树

红黑树必须要满足以下性质:

  • 1.每个结点不是红色就是黑色

  • 2.不可能有连在一起的红色结点(黑色的就可以),每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据

  • 3.根结点都是黑色 root

  • 4.每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;

并且在实际实现上往往会增加更多的限制,比如要求子链上的红色节点数量不能超过2个、左右子链相差的红色节点数量不能超过2个等条件来进一步限制红黑树的高度。

五、红黑树的变色与旋转

为了满足红黑树的性质,因此出现了红黑树的变换。

一共有以下3种变换:

  • 1.改变颜色:这是最简单的,红变黑,黑变红。

  • 2.左旋:针对某个点做旋转,要注意的是旋转点下面的子树也要跟着转,也就是父变子,子变父,指针跟着转。

  • 3.右旋:除方向外其他同左旋。

那么我们又该如何选择以上三种方式呢?

六、红黑树的变换规则

插入:(新加入的点一定要是红色,如果所有节点为黑色,那么红黑树就退化成了二叉查找树)

1.变颜色的情况:当前结点的父亲是红色,且它的祖父结点(爷爷)的另一个子结点(叔叔)也是红色。

(1)把父节点设为黑色

(2)把叔叔也设为黑色

(3)把祖父也就是父亲的父亲设为红色(爷爷)

(4)把指针定义到祖父结点(爷爷)设为当前要操作的

2.左旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是右子树。左旋以父结点作为左旋。指针变换到父亲结点。

3.右旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是左子树。右旋以祖父结点旋转。

(1)把父结点变为黑色

(2)把祖父结点变为红色 (爷爷)

(3)以祖父结点旋转(爷爷)

删除:较为复杂,待整理补充

七、红黑树的性能分析

插入的时间复杂度: 近似O(nlog(n))

查找的时间复杂度:O(log(n))

删除的时间复杂度:近似O(log(n))

八、红黑树的应用

1.HashMap(jdk8)

2.TreeMap

3.Windows底层:查找

度: 近似O(nlog(n))

查找的时间复杂度:O(log(n))

删除的时间复杂度:近似O(log(n))

以上是关于Java版高级数据结构二叉搜索树&红黑树的主要内容,如果未能解决你的问题,请参考以下文章

高效搜索数据结构之红黑树简介

AVL平衡二叉树,红黑树原理

数据结构~基础2~树《二叉树二叉搜索树AVL树B树红黑树》的设计~红黑树

平衡二叉搜索树(AVL树,红黑树)数据结构和区别

高级数据结构---红黑树及其插入左旋右旋代码java实现

数据结构与算法——红黑树