查找树
二叉排序树
二叉排序树是一棵具有如下特征的二叉树
- 若左子树非空,则左子树上所有结点的值均小于根结点的值
- 若右子树非空,则右子树上所有结点的值均大于根结点的值
- 左右子树分别是一棵二叉排序树
如下二叉排序树,依次插入了5、3、7、1、4、2
向二叉排序树中插入元素时,应符合如下规则
- 若原二叉排序树为空,则直接插入
- 原二叉排序树不为空,若待插入关键字小于结点值,则插入到左子树,大于结点值,则插入到右子树
删除元素时,应符合如下规则
- 若被删除的结点是叶节点,则直接删除
- 若被删除的结点只有一棵左子树或右子树,则让被删除结点的子树顶替被删除的结点
- 若被删除的结点同时拥有左右子树,则让二叉排序树在中序遍历下,被删除结点的直接后继顶替被删除的结点
平衡二叉树
在二叉排序树的基础下,确保任意结点的左右子树高度相差不超过1
,如下平衡二叉树,依次插入了5、3、7、1、4、2
向平衡二叉树中插入元素后,若导致二叉树不平衡,先找到离插入结点最近的不平衡二叉树的根结点,对该根结点做出相应调整
- LL平衡旋转:右旋
- RR平衡旋转:左旋
- LR平衡旋转:左旋+右旋
- RL平衡旋转:右旋+左旋
在平衡二叉树中删除元素后,若导致二叉树不平衡,先找到离插入结点最近的不平衡二叉树的根结点,对该根结点做出相应调整
- LL平衡旋转:右旋
- RR平衡旋转:左旋
- LR平衡旋转:左旋+右旋
- RL平衡旋转:右旋+左旋
红黑树
在二叉排序树的基础下,满足如下性质
- 每个结点或是红色,或是黑色
- 根结点是黑色的
- 虚构的外部结点是黑色的
- 不存在两个相邻的红结点
- 对每个结点,从该结点到任意一个叶结点的简单路径上,所含黑节点的数量相同
由红黑树性质得出的三个结论
- 从根结点到叶结点的最长路径不大于最短路径的2倍
- 有 $n$ 个内部节点的红黑树的高度 $h \le 2log_2(n+1)$
- 新插入红黑树的结点初始为红色
红黑树的插入用二叉查找树插入法插入,初始时将结点 $z$ 着为红色
- 若结点 $z$ 是根结点,则将结点 $z$ 着为黑色
- 若结点 $z$ 不是根结点,且结点 $z$ 的父结点是黑色,无需做任何调整
- 若结点 $z$ 不是根结点,且结点 $z$ 的父结点是红色,分如下三种情况,对红黑树做出不同调整
情况一:结点 $z$ 的叔结点(包括叔结点是外部节点的情况)是黑色的,且结点 $z$ 是一个右孩子,先来一次左旋,再来一次右旋
情况二:结点 $z$ 的叔结点(包括叔结点是外部节点的情况)是黑色的,且结点 $z$ 是一个左孩子,一次右旋
情况三:结点 $z$ 的叔结点(包括叔结点是外部节点的情况)和父结点都是红色的,先将父结点和叔结点着为黑色,爷结点着为红色,再把爷结点做为新结点重复循环
红黑树的删除用二叉查找树删除方法删除,初始时将结点 $z$ 着为红色
删除太难了,不写了