B-Tree 学习

算法导论 第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树

结构如下

 

 

          

posted on 2016-12-27 13:12  itdef  阅读(229)  评论(0编辑  收藏  举报

导航