简单说说二叉搜索树

1,344 阅读3分钟

目录:

  1. 什么是二叉搜索树
  2. 平衡二叉树
  3. 典型的平衡二叉树

1.什么是二叉搜索树

二叉树应该都不陌生,就像下面这副图展示的这样,是每个结点最多有两个子树的树结构

二叉树

那么二叉搜索树就是以一颗二叉树来组织,但是又需要满足如下特性:

1.对于任何节点x,其左子树的关键字<=x.key<=其右子树的关键字
2.在新增和删除关键字时也要满足如上特性

二叉搜索树如下图所示:

二叉搜索树

什么是二叉搜索树我们知道了,但是\color{red}{为什么需要使用二叉搜索树呢}

按照一般的有序查找,比如链表,查找时间应该是线性的,O(n);
那么二叉搜索树呢,其与树的高度成正比,平均查找时间为O(lgn);

所以我们使用一颗搜索树,能够很大程度上节约查找时间,尤其是随着关键字的增多,效果越显著。

2.平衡二叉树

上面我们说到二叉搜索树,红黑书其实是它的变种,但是\color{red}{为什么需要平衡二叉树呢}

不得不说随机二叉搜索树的弊端,\color{red}{无法保证树构造的情况},比如:

二叉树

如果如图中右侧所示,关键字来的顺序为(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树,一点都不神秘》
算法相关文章之三:《B树很简单,插入so easy》
算法相关文章之四:《什么是动态规划》
算法相关文章之五:《LCS,给你一个不一样的模糊匹配》