B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)

  关于B树的学习还是需要做点笔记。

  B树是为磁盘或者其他直接存取辅助存储设备而设计的一种平衡查找树。B树与红黑树的不同在于,B树可以有很多子女,从几个到几千个。比如一个分支因子为1001,高度为2的B树,他可以存储超过10亿个关键字,尽管如此,因为根节点(只有一个)保留在主存中,故这可书中,寻找某一个关键字之多需要两次磁盘存取。

  关于磁盘的结构,以及写入,读取数据的原理,这里就略过了。

  一、概述:

  1) 对于B树的每个节点x有:

    a)n[x],当前存储在结点x中的关键字数,

    b)关键字以非降序存放,因此 key1[x]<=key2[x]<=...<=keyn[x]

    c) leaf[x],是一个布尔值,用来表示结点x是不是叶子节点。

  2) 每个内结点包含n[x] + 1个指向其子女的指针 c1[x], c2[x], ... ,c (n[x]+1) [x]。当然叶节点没有c的定义。

  3) keyi[x]对存储在各子树中的关键字范围加以分隔。

  4) 每个叶节点具有相同的高度。

  5)每个节点能包含的关键字数具有一个上界和一个下界。这些界可以用一个称作B树的最小度数的固定整数t >=2 来表示。

  定理:h <= log t底 (n+1)/2。 证明略。详见 算法导论。

  二、基本操作:

  B树与搜索二叉查找树很相似,之时在每个节点所做的不是“二路选择”而是“根据子女数目做多路选择”。

  1) 创建一棵空 B树:

    首先创建一个空的根结点,再调用INSERT插入新的关键字。最后DISK-WRITE写入

  2) 插入:

    将新的节点插入到树中,当然是在不违反B树的有效性的前提下。那么如果新节点将要插入的节点y是一个满的叶节点,

  故需要引入一个“分裂”操作,将该节点从中间的关键字keyt[y]分为两个各含t-1个关键字的节点。中间关键字被提升

  到y的双亲结点。当然,如果y的双亲结点也是满的,那么就要保证在y做分裂操作之前就保证双亲已经通过分裂操作变得不满。

    为了满足以上要求:当我们在由上向下查找当前新结点的归属时,就将沿途的满节点分裂,那么就可以保证每当要分裂一

  个满结点y时,确保它的双亲不是满的。可以见得:树长高的唯一方式就是 分裂 根节点。

    首先,创建一个新结点z, 然后将原来y节点中的 t ... 2t - 1 (t- 1)个关键字剪贴至新结点z,然后将中间关键字放入y的

  父节点中。

      对B树用单程下行遍历树方式插入关键字:

  直接上图了吧。来自 --《算法导论》

  

  一图胜千言啊。

  4)删除操作

    对于结点x递归调用B-Tree-Delete后,x的关键字个数至少等于最小度t。注意!这个要求比之前的要求(B树中最少关

  键字个数t-1)多了一个,使得有时在递归降至某节点的一个子节点之前,一个关键字必须转移到子节点内。这个加强的条件

  允许我们在一趟下降的过程中,就可以将一个关键字从树中删掉。

   

  删除操作稍微复杂一点。总结一下复杂度:对于一棵高度为h的B树,它只需要O(h)次磁盘存取操作。所需CPU时间为O(th) = O(tlogt  n)。

时间: 2024-09-27 05:33:53

B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)的相关文章

41.Validate Binary Search Tree(判断是否为二叉搜索树)

Level: ??Medium 题目描述: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contain

[LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树思路完全一样,只不过是操作的数据类型有所差别,一个是数组,一个是链表.数组方便就方便在可以通过index直接访问任意一个元

二叉树、二叉搜索树、AVL树的java实现

数据结构一直都是断断续续的看,总是觉得理解的不够深入,特别是对树的理解,一直都很浅显,今儿又看了一遍,来做个总结吧. 首先,树中的一些概念: 1.树的节点包含一个数据元素,以及若干指向其子树的分支.节点拥有的子树的数量称为节点的度.节点的最大层次称为树的深度或高度. 2.二叉树是一种树形结构,其特点是每个节点至多有两棵子树,且子树有左右之分,次序不能随意颠倒. 3.满二叉树:一棵深度为k且有2^k - 1个节点的二叉树,称之为满二叉树. 4.完全二叉树:对一个深度为k,节点个数为n的二叉树,当且

数据结构学习笔记04树(二叉树、二叉搜索树、平衡二叉树)

一.树 树的基本术语 ①结点的度(Degree):结点的子树个数 ②树的度:树的所有结点中最大的度数 ③叶结点(Leaf):度为0的结点 ④父结点(Parent):有子树的结点是其子树的根结点的父结点 ⑤子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点:子结点也称孩子结点. ⑥兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点. ⑦路径和路径长度:从结点n1到nk的路径为一个结点序列n1 , n2 ,… , nk , ni是 ni+1的父结点.路径所包含边

108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树.此题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.示例:给定有序数组: [-10,-3,0,5,9],一种可行答案是:[0,-3,9,-10,null,5],它可以表示成下面这个高度平衡二叉搜索树:      0     / \   -3   9   /   / -10  5详见:https://leetcode.com/problems/convert-sorted-array-to-binary

二叉树之二叉搜索树(BSTree)

二叉搜索树(Binary Search Tree) 二叉搜索树是一种二叉树,子结点数量上限为2:为了方便搜索,结点是有序的,左结点的key不大于父节点,右节点的key不小于父节点,且左右子树也是二叉搜索树. 下面是一个二叉搜索树的样图,来自维基 一棵树一般都要提供一些函数,例如遍历.搜索.最大最小值.插入,删除,销毁等 代码含注释,下面是输出效果(msys2) 代码 开发环境:Qt Creator 4.8.2 Mingw64 7.3 windows 8.1 完整代码:https://github

[LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要将有序数组转为二叉搜索树,所谓二叉搜索树,是一种始终满足左<根<右的特性,如果将二叉搜索树按中序遍历的话,得到的就是一个有序数组了.那么反过来,我们可以得知,根节点应该是有序数组的中间点,从中间点分开为左右两个有序数组,在分别找出其中间点作为原中间点的左右两个子节点,这不就是是二分查找法的核

【二叉树】二叉搜索树

二叉搜索树: 1.每个节点都有一个关键码(key)作为搜索依据,关键码互不相同. 2.左子树的所有关键码都小于根节点的关键码. 3.右子树的所有关键码都大于根节点的关键码. 4.左右子树都是二叉搜索树. 删除key:左为空,右为空,左右都不空 1)左为空:cur的右树链到父节点 2)右为空:cur的左树链到父节点 3)左右都不空:找右树最左节点或左树最右节点,将找到的节点与cur交换后删除它. 二叉搜索树的增.删.查(非递归及递归)程序代码如下: #pragma once #include<st

二叉树之二叉搜索树的基本操作实现

这篇文章用来回顾二叉搜索数的以下操作: 遍历 前序遍历 中序遍历 后序遍历 层序遍历 查找 查找最大值 查找最小值 查找指定值 获取指定属性 获取总节点/叶节点数量 获取二叉树的高度(根的高度为1) 行为操作 插入 删除 二叉树的结构定义: 1 struct TreeNode{ 2 TreeNode():data(),left(nullptr),right(nullptr){} 3 ELEMENT data; 4 SearchTree left; 5 SearchTree right; 6 };