【发布时间】:2017-10-28 00:05:32
【问题描述】:
我正在尝试在 Java 中实现一个带有多元素节点的 Btree,每个节点中都有固定元素。我正在尝试为树创建一个插入方法。
例如,在我的代码中,每个节点将包含 3 个元素,每个元素将指向 2 个子节点(左和右)。它的工作原理类似于 2,3 树,但每个节点中的元素数量可能要大得多,并且每个节点都有固定长度的元素。 基本上,当节点分裂时,中间元素将得到提升。 此图显示了插入的工作原理:
这是我的代码,我正在写开始制作根节点,但我不知道如何通过重用插入和拆分方法使树更大。
public class BTree {
private Node root = null;
int maxElementInNode = 3;
public class Node {
//each node contain 3 elements
Element[] elements;
Element leftParent;
Element rightParent;
public Node(){
}
}
public class Element{
int key;
String rId;
Node leftNode;
Node rightNode;
public Element(int key, String rId){
this.key = key;
this.rId = rId;
}
}
//add new element to tree
public void addElement(int key, String rId){
//add element to root node
if(root == null){
root = new Node();
if (root.elements.length < maxElementInNode){
for(int i = 0; i<root.elements.length;i++){
if(root.elements[i] == null){
root.elements[i] = new Element(key, rId);
Arrays.sort(root.elements);
break;
}
}
//need to split
}else{
root = new Node();
split(root);
}
}
}
public void split(Node nodeToSplit){
if(root.elements == null){
//first element of root = median element of split node
root.elements[0] = nodeToSplit.elements[(maxElementInNode+1)/2];
}
Element[] leftChildNode = new Element[maxElementInNode];
Element[] rightChildNode = new Element[maxElementInNode];
for(int i = 0; i< (maxElementInNode+1)/2;i++){
leftChildNode[i] = nodeToSplit.elements[i];
}
Node left = new Node();
left.rightParent = nodeToSplit.elements[(maxElementInNode+1)/2];
left.elements = leftChildNode;
for(int j = ((maxElementInNode+1)/2)+1; j< maxElementInNode;j++){
int i = 0;
rightChildNode[i] = nodeToSplit.elements[j];
i++;
}
Node right = new Node();
right.elements = rightChildNode;
right.leftParent = nodeToSplit.elements[(maxElementInNode+1)/2];
}
}
【问题讨论】:
-
张贴图片链接,我会添加的
-
我认为在添加功能之前需要解决一些基本问题,例如:
Node字段(元素、leftParent、rightParent)未使用。您需要使用构造函数或设置器来初始化它们。这同样适用于Element(leftNode,rightNode)。addElement也只允许添加到空根。 -
谢谢,我只是放了图,我不是很擅长Java,只是做了Java课程的介绍。我在互联网上搜索了一些代码,但对我没有多大帮助。
-
所以一步一步来。在添加功能之前先修复代码/
-
你的意思是文件 Element(leftNode, rightNode) 不是必需的吗?或者你的意思是我需要添加构造函数?