我该如何处理在C ++中可视化B +树的任务?

时间:2012-08-20 15:02:15

标签: c++ recursion tree tree-traversal

我和我的朋友们必须在我们的数据库类上实现一个简单的DBMS。

DBMS的主要部分已经可以使用,这意味着所有命令(插入,删除,更新,选择)都经过了彻底的测试,似乎工作得很好。

现在我们必须实现一个B +树的最后一个功能,这在我看来是非常困难的。

我们尝试做的是首先实现一个可以在主内存中工作的简单B +树(在实现基于文件的版本之前)。在线阅读B +理论并研究各种伪代码后,我们设法创建了一个递归实现,并使用VS2010的调试器进行测试,看起来效果非常好。

问题是,我想在某种程度上可视化创建的树,因为我相信这将使我们的生活更容易调试。我的意思是如果你能看到它实际上是树,那么你可以肯定地知道结果是否正确。

所以,让我们以最简单的方式为例。假设B +树在其节点上有2个整数作为数据和3个指向子节点的指针。

让我们插入数字40,50,48,20,57,49。来自以下网站:http://www.seanster.com/BplusTree/BplusTree.html

我们得到以下动画:

enter image description here

我添加了箭头。

现在我想用以下方式在C ++中打印这个树:

          [48|50]
  [20|40] [48|49] [50|57]
然而,我不知道该怎么做。我已经阅读了关于树遍历的例子,例如预订,后序,但是我认为它们不会帮助我达到我想要的目的。

我所知道的只是根节点。从那个根节点,我必须通过以下方式在某种程度上遍历树:

  1. 访问root
  2. print root
  3. 访问root的孩子
  4. 打印每个孩子的值
  5. 对于每个根的孩子,访问它的孩子(这是根的孙子)。
  6. 打印盛大孩子的价值
  7. 为其他大孩子做同样的事情
  8. 以同样的方式为大孩子的孩子们做同样的事情
  9. 解决此问题的最佳方法是什么?提前致谢

1 个答案:

答案 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