二叉查找树
平衡树
2-3-4树
B树
B+树
一、二叉查找树
每个节点都大于其左子女的值,小于其右子女的值。
(1)Node类
value
左子女的引用
右子女的引用
(2)BST类
root节点
(3)contains(value)
判空
与根节点进行比较,如果value更小则在左子树递归比较,如果value更大则在右子树递归比较;
(4)findMin和findMax
findMin只要有左子树就向左进行;
递归的写法和while循环都行;
(5)insert
递归写法;
如果root = null,则返回一个新建的node;
如果比root小,则 root.left = insert(value, root.left);
如果比root大,则 root.right = insert(value, root.right);
(6)remove-最困难
- 第一步是要查找到要删除的节点; 如果该节点是叶子节点,那么直接将父节点上的对应引用设置为null就可以了;
- 如果该节点有一个子节点,那么将父节点对应的引用直接指向孙子就可以了;
- 如果该节点有两个子节点,那么使用这个节点的右子树的最小元素代替目前的值,然后递归地删除右子树的最小节点;这么选择的原因是右子树的最小节点一定没有左儿子,所以删除起来容易。
二、平衡二叉树
每个节点的平衡因子是0,1或者-1的树。平衡因子是左边的高度减去右边的高度。
三、2-3-4树
一个节点最多存放3个数值,从而产生最多4个区间,对应最多4个子节点;
所有叶子处于同一层;
创建一颗平衡的2-3-4树的关键是非叶子节点一旦变成了4-节点(有三个值)就进行拆分,拆分是在其父节点上添加值,而不是末端。
四、红黑树
红黑树是2-3-4树的一种表示方式,或者说实现模式。
红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
在O(log n)时间内做查找,插入和删除。
如果一条链接两端的节点属于2-3-4树的同一个节点,则将这条链接涂成红色。
下图虚线表示红链:
五、B树
B树是为磁盘和其他直接存取的辅助存储设备而设计的一种平衡搜索树。B树类似于红黑树,但它们在降低I/O操作数方面要更好一些。许多数据库系统使用B树或者B树的变种来存储信息。
B树与红黑树的不同之处在于B树的结点可以有很多孩子,从数个到树千个。也就是说,一个B树的“分支因子”可以相当大,尽管它通常依赖于所使用的磁盘单元的特性。B树类似于红黑树,就是每棵含有n个结点的B数高度为O(lgn)。然而,一棵B树的严格高度可能比一棵红黑树的高度要小许多,这是因为它的分支因子。
在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查找的关键字在Ki与Ki+1之间,Pi为指向子树根节点的指针,此时取指针Pi所指的结点继续查找,直至找到,或指针Pi为空时查找失败。
如果设B-树包含N个关键字,则它有N+1个叶子结点。
六、B+树
B+ 树是一种树数据结构,是一个n叉排序树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。B+ 树通常用于数据库和操作系统的文件系统中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入。
B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树。B树类似于红黑树,但它们在降低磁盘I/O操作数方面要更好一些。现在许多数据库系统使用B树或者B树的变种(B+树和B*树)来存储信息。B树用的比较普遍,许多书籍、博客都有详细的介绍,对于B树的严格定义也相对统一,在这里就不予赘述。 B+树是B树的一种变形,它把所有的卫星数据都存储在叶节点中,内部节点只存放关键字和孩子指针,因此最大化了内部节点的分支因子,所以B+树的遍历也更加高效(B树需要以中序的方式遍历节点,而B+树只需把所有叶子节点串成链表就可以从头到尾遍历)。
定义:
B+树是应文件系统所需而出的一种B树的变型树。一棵m阶的B+树和m阶的B-树的差异在于:
1.有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。
通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。