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