算法导论 第18章 B树
与其他树的结构不同的是 B数是多叉而不是二叉树 而且分叉因子很大
一般使用于数据库 针对需要硬盘IO的情况而使用 可以降低磁盘IO
B树的一个节点是以磁盘的页面为单位,而不是数据内容为单位 一般一个节点等于一个完整的磁盘页
以下B树性质是本人理解 具体定义可查阅算法导论18章节
除了根节点以外 所有节点拥有T-1个 到 2T-1个关键字
关键字升序或者降序排列
节点拥有T个到2T个指针 指向子节点 定义为子节点
若节点仅拥有关键字而无指针 为叶子节点 在树的最下端
T=2时候 树拥有2、3或者4个子节点 成为2-3-4树
以下为我学习的一个简单代码 确定了B树的结构和创建、查找功能 打印节点数值功能。
增删功能比较麻烦,后继增加
// 1213.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <list> #include <vector> #include <assert.h> using namespace std; #define t 2; struct MyB_Tree { size_t keySize_; bool isLeaf_; std::vector<size_t> keys_; std::vector<MyB_Tree*> subTrees_; MyB_Tree() { keySize_ = 0; isLeaf_ = true; } }; struct SearchResult { MyB_Tree* pBTree_; size_t keyNum_; SearchResult() { pBTree_ = NULL; keyNum_ = 0; } SearchResult(MyB_Tree* pBTree, size_t keyNum) { pBTree_ = pBTree; keyNum_ = keyNum; } }; MyB_Tree* CreateB_TreeNode() { MyB_Tree* pBTree = new MyB_Tree(); return pBTree; } bool BTreeeSearch(MyB_Tree* pBTree, size_t value, SearchResult& result) { bool ret = false; size_t i = 0; while (i <pBTree->keySize_ && value > pBTree->keys_[i]) { i++; } if (i <pBTree->keySize_ && value == pBTree->keys_[i]) { result.pBTree_ = pBTree; result.keyNum_ = i; ret = true; return ret; } if (pBTree->isLeaf_) { return ret; } else { return BTreeeSearch(pBTree->subTrees_[i], value, result); } } void PrintTree(MyB_Tree* p) { std::cout << "//==========================\nstart print keys : "; for (int i = 0; i<p->keySize_; i++) { std::cout << p->keys_[i] << " "; } std::cout << "\n//==========================" << std::endl; if (!p->isLeaf_) { for (int i = 0; i <= p->keySize_; i++) { PrintTree(p->subTrees_[i]); } } } int main(int argc, char *argv[]) { MyB_Tree* root = CreateB_TreeNode(); MyB_Tree* subright = CreateB_TreeNode(); MyB_Tree* subleft = CreateB_TreeNode(); root->keySize_ = 1; root->keys_.push_back(20); subleft->keySize_ = 2; subleft->keys_.push_back(10); subleft->keys_.push_back(19); subright->keySize_ = 3; subright->keys_.push_back(21); subright->keys_.push_back(25); subright->keys_.push_back(30); root->isLeaf_ = false; root->subTrees_.push_back(subleft); root->subTrees_.push_back(subright); PrintTree(root); SearchResult result; assert(BTreeeSearch(root, 33, result) == false); assert(BTreeeSearch(root, 25, result) == true); assert(result.pBTree_ == subright); assert(result.keyNum_ == 1); std::cout << "finished " << std::endl; return 0; }
运行截图
代码建立了一个B树
结构如下