前言
本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。
你好,我是彤哥。
前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下:
实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。
说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早期的Linux内核中就一直存在红黑树的实现,也运用在了更高效的多路复用器Epoll中。
所以,红黑树是每一个程序员不得不会的知识点,甚至有些变态的面试官,还会让你手写红黑树的一部分实现,比如左旋、右旋、插入平衡的过程、删除平衡的过程,这些内容非常复杂,靠死记硬背往往很难彻底掌握。
彤哥也是一直在寻找一种红黑树的记忆法,总算让我找到了那么一种还算不错的方式,从红黑树的起源出发,理解红黑树的本质,再从本质出发,彻底掌握不用死记硬背的方法,最后再把它手写出来。
从本节开始,我也将把这种方法传递给你,因此,红黑树的部分,我会分成三个小节来讲解:
- 从红黑树的起源,到红黑树的本质
- 从红黑树的本质,找到不用死记硬背的方法
- 不靠死记硬背,手写红黑树
好了,下面我们就进入第一小节。
红黑树的起源
二叉树
说起树,我们不得不说最有名的树,那就是二叉树,什么是二叉树呢?
二叉树(binary tree),是指树中的每个节点最多只有两个子节点的树。
当然,二叉树本身似乎没什么用,我们平时说的二叉树基本上都是指二叉查找树,或者叫有序二叉树、二叉搜索树、二叉排序树。
二叉查找树
二叉查找树(BST,binary search tree),就是在二叉树的基础上增加有序性&