二叉排序树
-
特征
(1) 若它的左子树不空,则 左子树 上所有结点的值 均小于 它的根结点的值;
(2) 若它的右子树不空,则 右子树 上所有结点的值 均大于 它的根结点的值;
(3) 它的 左、右子树又分别为二叉排序树 -
典型的二叉排序树
-
获得一个二叉排序树方法
有一个无序列表,将第一个数作为根节点,接下来的数依次都按以下插入:- 与根节点比较,大值往右小值往左,继续与左/右结点比较直到左/右结点为null
-
二叉排序树的一个重要特性
- 对二叉排序树进行中序遍历后得到的序列是从小到大的序列
- 二叉排序树的查找
-
tip
与二分查找类似,利用了每个节点的左节点小于根节点,右边节点大于根节点的排序数的特征 -
实例
在以下二叉排序数里找13
- 插入节点:与获得一个二叉树的过程一样,从根节点开始比较,直到叶子结点就插入其左/右节点
删除节点 - 删除结点
- 删除叶子结点:直接删除
- 删除非叶子节点
-
只有左/右子树
原理:将当前节点的左/右节点连接到当前节点的父节点
实际操作:令temp=左/右节点,删除左/右节点,将temp连接到左/右节点的父节点上(与其比较,小接左,大接右) -
左右子树同时存在(两种方案)
①以大值替换
删除8节点
②以小值替换
删除8节点
-
删除过程
-
方案1
1、找到要删除节点的左子树中的最大值(遍历左子树的右节点直到叶子结点)
2、将要删除的值替换成该最大值
3、去除左子树中的该值 -
方案2
1、找到要删除节点的右子树中的最小值(遍历右子树的左节点直到叶子结点)
2、将要删除的值替换成该最小值
3、去除右子树中的该值
-
-
平衡二叉树
- 适用
-
需要查找的集合本身没有顺序
-
需要频繁查找的同时也需要经常的插入和删除
- 作用
-
通过将二叉树保持平衡就可以防止二叉排序树变成链表
-
若不维持平衡,二叉树就可能变成链表,失去了它的树的优势
-
且不平衡的二叉排序树查找效率很低
-
特征
①是一个二叉排序树
②每个节点的左子树和右子树的高度差至多为1 -
相关概念
- 某节点的平衡因子:左子树的高度-右子树的高度
术语:BF(Balance Factor)- 要使二叉排序树保持平衡,就得维持每个节点的平衡因子至多为1
- 最小不平衡结点:距离插入节点最近的,且平衡因子的绝对值大于1的节点
- 最小不平衡树:最小不平衡结点及其子树构成的树
- 某节点的平衡因子:左子树的高度-右子树的高度
-
对二叉排序树的平衡调整
在插入节点时进行调整,根据插入节点的最小不平衡结点往下两个子节点所在位置分以下为四种情况
①LL情况- 特征:最小不平衡结点的子节点为左节点,子节点的子节点也是左节点
- 调整方案
②RR情况
- 特征:最小不平衡结点的两个子节点都为右节点
- 调整方案
③LR情况
- 特质:最小不平衡结点的第一个子节点为左结点,子节点的子节点为右节点
- 调整方案
④RL情况
- 特质:最小不平衡结点的子节点为右节点,子节点的子节点为左结点
- 调整方案
-
获取一个平衡二叉树
1、得到一个无序数列
2、将无序数列以二叉排序树的插入规则插入,并随时判断是否有节点的平衡因子大于1
3、当新插入结点导致不平衡,以新插入节点与最小不平衡结点所构成的链状结构根据对二叉排序树的平衡调整 的四种情况来调整
4、调整完继续插入,继续调整,循环往复以至节点全部插入 -
删除节点
-
删除叶子结点:直接删除
-
删除节点仅有左子树或右子树
- 按照二叉排序树的删除去删除
- 删除完可能要进行平衡调整
-
删除节点左右子树同时存在
1、若删除节点的平衡因子为0或1
①找到删除节点的左子树的最大节点,称其为标记节点
②令删除节点的权值=标记节点的权值
③删除原标记节点位置的节点
与二叉排序树的删除相似2、若删除节点的平衡因子为-1
令右子树的最小值为标记节点,然后按照1步骤来做3、删除后若二叉树失去平衡还要进行平衡调整
-