二叉搜索树
二叉搜索树的删除:
- 要删除的结点是叶结点:直接删除
- 要删除的结点只有一个孩子结点:将其父节点的指针指向要删除结点的孩子结点
- 要删除的结点有两个儿子结点:找右子树中的最小值或者左子树中的最大值来替换被删除结点。
图片截于MOOC浙江大学数据结构
平衡二叉树
任意结点左右子树高度差的绝对值不超过1.
平衡二叉树的调整:RR、LL、RL、LR
危机结点:下一个结点的插入可能导致该节点失去平衡,即当前结点的左右子树高度不等
RR:右子树高且插入结点插在右子树的右子树上上,将危机结点的右子树取代危机节点(危机结点的右儿子放在危机结点的位置上其右子树也跟着移动位置,如果它有左子树,则左子树作为原危机结点的右子树,而以原危机结点为根的树则放在取代危机结点的结点的左子树上)。LL同理。
LR:左子树高且结点插在左子树的右子树上
RL同理(相对于危机结点来说)
堆
堆的两个特性
结构性:用数组表示的完全二叉树
有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)
· 最大堆也称大顶堆:最大值
· 最小堆也称小顶堆:最小值
插入操作可能会改变堆的有序性。
堆的删除:取出最后一个结点(因为完全二叉树删除一个结点后消失的肯定是最后一个结点),然后在以被删除结点为根的大顶堆中,住上往下开始查找其左右儿子中最大的(如果是小顶堆就找最小的),如果左右儿子中最大的比最后一个结点(即取出的结点)大,那么就用最大的这一个替换掉父节点,继续查找直到左右儿子中最大的结点都小于最后一个结点为止或者所有节点都已被查找;如果左右儿子中最大的比最后一个结点都小,那么直接将最后一个结点替换掉其父节点即可。
建立最大堆:
- 将已经存在的N个元素按最大堆的要求存放在一个一位数组中;
- 从下往上,找到最后一个有儿子结点的结点,将其变成大顶堆,重复如下动作:将其序号减一直到根节点,将以该节点为根的树变成大顶堆。
(参考MOOC-浙江大学数据结构)