B-Tree如何进行中序遍历?

How to do InOrder traversal with B-Tree?

struct BTreeNode {
    bool is_leaf=true;
    std::vector<int> elements;
    std::vector<BTreeNode*> children;
    BTreeNode() {}
    BTreeNode (std::vector<int> v) {
    this->elements = v;
    }
};

void traverse(BTreeNode* root) {
  for(int i = 0; i < (int)root->children.size(); ++i){
    traverse(root->children[i]);
    cout << root->elements[i] << endl;
  }
  traverse(root->children[root->children.size() -1]);
}

我的方法有点段错误。我们如何为 B-Tree 编写正确的 inOrder Traversal?

这可能是您在叶子上时的最后一次遍历调用。我认为不需要这种遍历。

假设 BTreeNode 是您的 b-tree 节点的通用定义,而 T1 是键的类型,T2 是树中值的类型,而 sortedKeys 是您之后的列表,您可以使用下面的递归方法。思路很像二叉搜索树中的中序遍历,先访问left-mostchild,然后访问key-再继续,因为children的个数在[=15] =]总是比键的个数大1,访问键前需要检查[代码是c#,但可以很容易地转换成任何其他语言,目的只是展示算法]。

public void InOrderTraversal(BTreeNode<T1, T2> node, List<KeyValuePair<T1, T2>> sortedKeys)
        {
            if (node != null)
            {
                for (int i = 0; i < node.Children.Count; i++)
                {
                    InOrderTraversal(node.Children[i], sortedKeys);
                    if (i < node.KeyValues.Count)
                        sortedKeys.Add(node.KeyValues[i]);
                }
            }
        }