红黑树小抄
写在前面
算法分析课 期末考红黑树也是没谁了…
不过不幸中的万幸是应该只考插入,
我就在这打个小抄,大家就当考前热个身
红黑树的性质
- 是一颗BST(不会BST请自行查阅)
- 根节点是黑色,节点要么是红色要么是黑色
- 假设所有叶子结点是nil,则任意子树任意路径到达nil的黑色节点个数相同
- 所有叶子结点都是nil,并且是黑色
- 红节点不与红节点邻接,即如果某个节点是红色,其子节点一定是黑色(nil也是黑色)
红黑树的插入
前导知识
- BST的旋转操作
- BST的插入操作
待插入的节点一开始设为红色
我们根据BST的性质找到叶子结点的位置插入
叔叔节点:我们称当前节点的父节点的兄弟节点为叔叔节点
我们把指针指向待插入节点, 讨论待插入节点几种情况:
-
父节点是黑色,很幸运,直接插入。
-
当前没有节点,直接插入,并把节点染成黑色
-
父节点是红色
-
叔叔节点是红色
-
把当前节点的 父节点与叔叔节点染成黑色
-
指针指向当前节点的祖父节点并将祖父节点染成红色
-
-
叔叔节点是黑色
- LL
- 右旋当前指针节点
- 交换指针节点与右子节点的颜色
- LR
- 左旋转化为LL
- do LL
- RR
- 左旋当前指针节点
- 交换指针节点与左子节点的颜色
- RL
- 右旋转化为RR
- do RR
- LL
-
复杂度
这里打个小抄,不做证明
插入、查找、删除的时间复杂度只与红黑树的高度有关
h e i g h t = 2 l o g ( N + 1 ) → O ( l o g N ) height = 2log(N+1) \rightarrow O(logN) height=2log(N+1)→O(logN)
证明的思路大概就是:
- 首先忽略黑节点,计算只有红节点的树的高度
- 忽略红节点,计算只有黑节点的树的高度
- 将高度相加即为红黑树的高度