【发布时间】:2015-09-16 15:46:28
【问题描述】:
我正在尝试在 java 中实现 B+ 树。如果第一个插入仅保存在叶子中,或者有 2 个条目,即根中的一个,指向叶子和叶子中的一个(带有数据指针),我会感到困惑。
如果我尝试在两者中输入它,我将有 2 个几乎为空的叶节点。
如果我只是在叶子中输入它,我的根将是叶子类型。我不确定 root 是否可以是叶子类型。
public class BTree {
private BTreeInnerNode root;
private int fanout = 3;
public BTreeInnerNode getRoot() {
return root;
}
public BTree(int fanout) {
this.fanout = fanout;
}
public BTree(){
root = new BTreeInnerNode(fanout);
}
}
节点
public class BTreeInnerNode extends BTreeNode {
public BTreeNode[] children;
public BTreeInnerNode(int fanout){
super(fanout);
nodeType = NodeType.Node;
children = new BTreeInnerNode[2*fanout];
}
}
叶子
public class BTreeLeafNode extends BTreeNode {
public int[] rid;
public BTreeLeafNode(int fanout) {
super(fanout);
nodeType = NodeType.Leaf;
rid = new int[(2*fanout)-1];
}
}
感谢您的帮助。
【问题讨论】:
-
不应该所有节点都是Node类型吗?
-
我有一个 Node 和 Leaf 的基类,因为它们都有一些共同点,但是 Node 会存储指向下一个节点或叶子的指针,而叶子只会存储记录 id,所以我创建了 2亚型
-
每个节点都有一个值,如果“NextNode”为空,那么它就是一个叶子节点。你不需要两个子类型
-
@Steve 叶子节点和 B+ 中的内部节点在概念上是不同的——其中一个存储实际数据,另一个存储一组键。虽然在这个特定的实现中,数据本身被用作键,但我认为保持类型不同会更好。
-
@IvayloStrandjev 没关系,每个节点内的数据可以代表“实际”数据,或者关键取决于它是否有更多的孩子。这将使插入更容易,因为您不需要每次都转换类型