数据结构与算法-基础(十)平衡二叉搜索树
摘要
二叉搜索树的特性-节点的左侧部分比它小,右侧部分比它大,使得二叉搜索树在查找节点有二分法的效果,也提高了它的添加和删除处理,毕竟添加和删除也是先查找位置,然后再处理。
平衡二叉搜索树就是持续保证这样的高效性,进入正题:
二叉搜索树在添加或者删除的过程中,在一些场景下退化为链表,比如对比一组数据:7、4、9、2、5、8、11。按照现在的顺序添加和按照数据的大小依次添加的结果:
当数据已经有顺序,使用二叉搜索树添加就会变成一个线性链表,这是我们不愿意看到的结果。
同理,在删除节点的时候,也是容易多次删除之后的二叉搜索树也会是一个线性链表。
所以就引入平衡二叉搜索树来避免退化成线性表的问题。
平衡
二叉搜索树节点数量确定不变的情况下,左右子树的高度越接近,这个二叉搜索树就越平衡。最理想的平衡就是左右子树的高度差为 0 或 1,比如满二叉树或完全二叉树。
如何平衡?
添加节点或者删除节点是不能限制,也就是不能控制二叉搜索树的节点数量。所以只能在添加或者删除之后去调整二叉搜索树的高度,达到平衡。
若要达到理想中的平衡(比如完全二叉树),也是没有问题的,就是增加调整的次数的处理。但是凡事都要有个度,调整的次数多了,反而会增加时间复杂度。所以调整到平衡的原则就是用尽量少的调整次数达到适度平衡就好,这样达到适度平衡的二叉搜索树,也叫做平衡二叉搜索树。
平衡二叉搜索树
平衡二叉搜索树,英文为 Balanced Binary Search Tree,简称 BBST。比较经典的平衡二叉搜索树有AVL 树和红黑树。这里先简单介绍,平衡二叉搜索树逻辑和细节很多,后在接下来分很多期来说明。
AVL 树
AVL 树命名是根据它的两位发明者名称得来,是相对很早发明的自平衡搜索树之一。
AVL 树引入平衡因子的概念,平衡因子为某个节点的左右子树的高度差。每个节点的平衡因子只可能是 1、0、-1,当超过这个范围就是失衡。
红黑树
红黑树也是自平衡的二叉搜索树,它的节点只有红色或者黑色,并且根节点是黑色,叶子节点是红色,红色节点的子节点必须是黑色,父节点也必须是黑色。
这些规则构成整个红黑树。
AVL 树和红黑树被应用到很多场景,是数据结构中基础并且重要的部分。很多优秀的数据结构或者算法基于它实现或者借鉴它的思路。很值得花费精力去弄懂它。
- 《大话数据结构》读书笔记(一)——数据结构基础和算法
- 数据结构与算法基础————基本概念和术语
- 【数据结构与算法的语言基础】数组与字符串
- 算法基础:数据类型,基础结构(一)
- 数据结构基础算法-二叉树
- 数据结构,算法,网络,操作系统,语言基础
- 数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串
- 算法备忘录——基础数据结构与复杂度
- 算法竞赛入门经典:第六章 数据结构基础 6.14欧拉回路
- 学点PYTHON基础的东东--数据结构,算法,设计模式---访问者模式
- 基础算法(二)---数据结构之堆
- 数据结构基础算法整理归纳:冒泡排序(二)
- .net 数据结构与算法基础:泛型链表使用
- 开发与面试涉及的基础数据结构和算法-Algorithm
- 数据结构与算法-基础(三)- 循环链表(补充)
- 通俗易懂的数据结构(1)_python实现_数据结构基础及算法基础
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- 基础数据结构算法_二叉树的恢复和非递归遍历
- 数据结构基础算法-链表
- 【数据结构基础】判别给定的表达式所含括号是否正确配对出现的算法。