我和我的朋友们必须在我们的数据库类上实现一个简单的DBMS。
DBMS的主要部分已经可以使用,这意味着所有命令(插入,删除,更新,选择)都经过了彻底的测试,似乎工作得很好。
现在我们必须实现一个B +树的最后一个功能,这在我看来是非常困难的。
我们尝试做的是首先实现一个可以在主内存中工作的简单B +树(在实现基于文件的版本之前)。在线阅读B +理论并研究各种伪代码后,我们设法创建了一个递归实现,并使用VS2010的调试器进行测试,看起来效果非常好。
问题是,我想在某种程度上可视化创建的树,因为我相信这将使我们的生活更容易调试。我的意思是如果你能看到它实际上是树,那么你可以肯定地知道结果是否正确。
所以,让我们以最简单的方式为例。假设B +树在其节点上有2个整数作为数据和3个指向子节点的指针。
让我们插入数字40,50,48,20,57,49。来自以下网站:http://www.seanster.com/BplusTree/BplusTree.html
我们得到以下动画:
我添加了箭头。
现在我想用以下方式在C ++中打印这个树:
[48|50]
[20|40] [48|49] [50|57]
然而,我不知道该怎么做。我已经阅读了关于树遍历的例子,例如预订,后序,但是我认为它们不会帮助我达到我想要的目的。
我所知道的只是根节点。从那个根节点,我必须通过以下方式在某种程度上遍历树:
解决此问题的最佳方法是什么?提前致谢
答案 0 :(得分:0)
扩展我关于水平顺序遍历的评论 - 如果我理解你正确的要求,这样的事情应该有用吗?好吧,它实际上不会起作用,因为myNode和诸如此类的东西没有被定义,但希望它能显示出这个想法。
std::vector<std::vector<std::string> > reprVect;
void visit(myNode n) {
if (reprVect.size() < myNode.level)
reprVect.push_back(std::vector<std::string>());
}
reprVect[myNode.level].push_back(myNode.string_repr());
}
// [...]
std::queue<myNode> q;
q.push_back(rootNode);
while (!q.empty()) {
myNode curNode = q.front();
q.pop_front();
visit(q);
if (curNode.left != NULL) {
q.push_back(curNode.left);
} else { /*insert blank into the reprVect */ }
if (curNode.right != NULL) {
q.push_back(curNode.right);
} else { /*insert blank into the reprVect */ }
}
// use cout to print contents of reprVect