一.二叉排序树(二叉查找树)
性质:
要么是空树,要么是具有下列性质的二叉树:
①若左子树不为空,那么左子树上所有节点的值均小于根节点的值
②若右子树不为空,那么右子树上所有节点的值均大于根节点的值
③左右子树都是二叉排序树.
例如下图:
特点:
中序遍历将得到一个有序序列
存储结构:二叉链表
操作:
1.二叉排序树的查找
设要查的值为K,那么如果now指针为空,则查找失败,否则
①now->data < K,向now的右子树查找
②now->data > K,向now的左子树查找
2.二叉排序树的插入
先查找再插入,过程与上面差不多.now为空时则找到插入位置,插入。
值得注意的是,当有重复的值出现的时候,如果应用要求无重复,则查找失败。否则,通常插入到右子树.
3.二叉排序树的建立:插入
4.二叉排序树的删除
分情况讨论:设要删除的点为p点,其双亲为s点.
①p点为叶子结点,直接删除p点
②p点只有左子树或右子树,将左/右孩子代替p点再删除p点.
③左右子树都有,那么我们需要寻求一个最合适的节点来代替p点。两种方法,用左子树的最大值或右子树的最小值来代替p点。具体做法是走右子树,之后一直往左子树走,直至叶节点s,赋data给p,删除s点(注意s点可能有右孩子,要将s点的右孩子往上接). 还有一种情况,p点的右孩子就是右子树最小者.那么就将s的右孩子接在p点上.
(代码实现:传参数p,f代表要删除的点以及其双亲节点)
5.二叉排序树的性能分析:
斜树O(n),满二叉树O([logn] + 1);
二.平衡二叉树
前言:
从第五点可以看出,树的形态影响着排序二叉树的时间复杂度,而树的形态受输入的序列的影响,而序列的顺序是无法控制的,这自然就要求我们寻找一种动态平衡。
性质:
要么是棵空的二叉排序树,要么具有以下性质:
①根节点的左子树和右子树的深度最多相差1
②根节点的左子树和右子树都是平衡二叉树
概念:
平衡因子:左右子树深度之差.
最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树.
最小不平衡点:上述的那个节点.
平衡调整:(核心:扁担原理,子树分配)
①LL型,RR型 (多出一个子树 ):将重的孩子往上提,多出来的子树分配给原先的不平衡点(不然没地方去)
②LR型,RL型(多出两个子树):两个步骤.将重的子树往上提,其中一个子树分配到下降的节点去,再以上面一个点为重心,将重的子树往上提,其中一颗子树分配到下降的节点去。
复杂度:O(logn)