目录:
- 什么是二叉搜索树
- 平衡二叉树
- 典型的平衡二叉树
1.什么是二叉搜索树
二叉树应该都不陌生,就像下面这副图展示的这样,是每个结点最多有两个子树的树结构
那么二叉搜索树就是以一颗二叉树来组织,但是又需要满足如下特性:
1.对于任何节点x,其左子树的关键字<=x.key<=其右子树的关键字
2.在新增和删除关键字时也要满足如上特性
复制代码
二叉搜索树如下图所示:
什么是二叉搜索树我们知道了,但是
按照一般的有序查找,比如链表,查找时间应该是线性的,O(n);
那么二叉搜索树呢,其与树的高度成正比,平均查找时间为O(lgn);
复制代码
所以我们使用一颗搜索树,能够很大程度上节约查找时间,尤其是随着关键字的增多,效果越显著。
2.平衡二叉树
上面我们说到二叉搜索树,红黑书其实是它的变种,但是
不得不说随机二叉搜索树的弊端,,比如:
如果如图中右侧所示,关键字来的顺序为(8, 10,11,12,13,15....),那么就会一直建立右侧子树,那么对于这颗二叉搜索树来说,其查找效率并没有比单纯的链表高,因为树高很高。
如果是左侧的构造方式,树高能保持一定的平衡,来保证查找效率。
3.典型的平衡二叉树
常用的有B树、红黑树、AVL等
3.1 AVL
AVL是严格的二叉平衡树,平衡条件必须满足(所有节点的左右子树高度差不超过1);
一旦不满足平衡,就需要进行调整
由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故适用于插入删除不频繁,但查找要求较高的场合。
复制代码
3.2 红黑树
保证最坏的情况下基本动态集合操作的时间复杂度为O(lgn)
近似于平衡,要求没有AVL严格
有如下特性:
1.每个节点只能要么是红色的,要么是黑色的
2.根节点和叶子节点是黑色的
3.如果一个节点是红色的,则它的子节点必须都是黑色的
4.对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
5.更新删除新增操作也必须保证如上特性
复制代码
红黑树的应用非常广泛,比如C++的STL中,地图和集都是用红黑树实现的。
3.3 B树
在《B树一点都不神秘》一文中已经详细介绍过B树;
为磁盘或者其他直接存储的辅助存储设备设计
类似于红黑树,但是更降低磁盘操作I/O
节点分为内部节点(非叶子节点)和叶子节点
节点可以不止一个关键字
假设节点中的关键字个数为n,则该节点的孩子数一定是n+1
.....
复制代码
B树与红黑树的不同之处在于B树的节点可以有很多孩子,从数个到数千个。所以B树的分支可以非常大; B树的高度也是O(lgn),但是呢,B树的严格高度要比红黑书的高度要小很多,因为B树可以有很大的分支因子,将树的高度拉低。
其他相关章节
复制代码
算法相关文章之一:《简单说说二叉搜索树》
算法相关文章之二:《B树,一点都不神秘》
算法相关文章之三:《B树很简单,插入so easy》
算法相关文章之四:《什么是动态规划》