[英]How should I approach the task of visualizing a B+ tree in C++?
我和我的朋友們必須為我們的數據庫類實現一個簡單的DBMS。
DBMS的主要部分已准備就緒,可以使用,這意味着所有命令(插入,刪除,更新,選擇)均已經過全面測試,並且工作正常。
現在,對於最后一個功能,我們必須實現一個B +樹,以我的誠實觀點,這非常困難。
我們試圖做的是首先實現一個簡單的B +樹,該樹將在主內存中工作(在實現基於文件的版本之前)。 在在線閱讀了B +理論並研究了各種偽代碼之后,我們設法創建了一個遞歸實現,我使用VS2010的調試器對其進行了測試,並且看起來效果很好。
問題是,我想稍微可視化所創建的樹,因為我相信這將使我們的調試工作變得更加輕松。 我的意思是,如果您可以看到實際的樹,那么您可以確定結果是否正確。
因此,讓我們以最簡單的情況為例。 假設B +樹在其節點上具有2個整數作為數據和三個指向子節點的指針。
讓我們插入數字40,50,48,20,57,49。 從以下網站: http : //www.seanster.com/BplusTree/BplusTree.html
我們得到以下動畫:
我添加了箭頭。
現在,我想以以下方式在C ++中打印此樹:
[48|50]
[20|40] [48|49] [50|57]
但是我不確定該怎么做。 我已經閱讀了關於樹遍歷的信息,例如預順序,后順序,順序,但是我認為它們不會幫助我實現我想要的目標。
我所知道的只是根節點。 從該根節點,我必須以某種方式遍歷樹:
解決這個問題的最佳方法是什么? 提前致謝
擴展我對級別順序遍歷的評論-如果我正確理解了您的要求,則類似的事情應該起作用。 嗯,它實際上不起作用,因為未定義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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.