簡體   English   中英

我應該如何處理在C ++中可視化B +樹的任務?

[英]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]

但是我不確定該怎么做。 我已經閱讀了關於樹遍歷的信息,例如預順序,后順序,順序,但是我認為它們不會幫助我實現我想要的目標。

我所知道的只是根節點。 從該根節點,我必須以某種方式遍歷樹:

  1. 訪問根
  2. 打印根
  3. 拜訪根的孩子
  4. 打印每個孩子的值
  5. 對於根的每個子代,請訪問根的子代(即根的孫代)。
  6. 打印孫子的值
  7. 對其他大孩子也一樣
  8. 以同樣的方式對大孩子等的孩子做同樣的事情

解決這個問題的最佳方法是什么? 提前致謝

擴展我對級別順序遍歷的評論-如果我正確理解了您的要求,則類似的事情應該起作用。 嗯,它實際上不起作用,因為未定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM