【问题标题】:How to do InOrder traversal with B-Tree?如何使用 B-Tree 进行 InOrder 遍历?
【发布时间】:2017-08-25 00:21:22
【问题描述】:
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?

【问题讨论】:

  • 两个遍历应该相同:traverse(root->children[i])。并且不要忘记检查root是否为“is_leaf”

标签: c++ b-tree


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    假设 BTreeNode 是您的 b-tree 节点的通用定义,而 T1 是键的类型,T2 是树中值的类型,而 sortedKeys 是您所追求的列表,您可以使用以下递归方法。思路很像二叉查找树中的inOrder遍历,先访问最左边的孩子,再访问key-然后继续,由于B-tree中child的个数总是比key的个数大一,所以在访问密钥之前需要检查[代码是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]);
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2017-09-16
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2021-10-19
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多