【问题标题】:Implement Btree with multi-elements node java用多元素节点java实现Btree
【发布时间】: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) 不是必需的吗?或者你的意思是我需要添加构造函数?

标签: java b-tree


【解决方案1】:

要在 cmets 中回答您的问题,请参阅以下修改后的 Element 类:

public class Element{

    //you need a way to initialize fields. For this use a constructor,
    //a setter, or both 
    private int key;
    private String rId;
    private Node leftNode;
    private Node rightNode;

    //if all fields are know when constructing the object, you can do it 
    //in the constructor 
    public Element(int key, String rId, Node leftNode, Node rightNode) {

        this.key = key;
        this.rId = rId;
        this.leftNode = leftNode;
        this.rightNode = rightNode;
    }

    public Element(int key, String rId){

        this.key = key;
        this.rId = rId;
    }

    //alternatively, or in addition, you can use setters to set fields,
    //and getters to retrieve thier values (remove unneeded setters / getters)
    public int getKey() {
        return key;
    }

    public String getrId() {
        return rId;
    }

    public Node getLeftNode() {
        return leftNode;
    }

    public Node getRightNode() {
        return rightNode;
    }

    public void setKey(int key) {
        this.key = key;
    }

    public void setrId(String rId) {
        this.rId = rId;
    }

    public void setLeftNode(Node leftNode) {
        this.leftNode = leftNode;
    }

    public void setRightNode(Node rightNode) {
        this.rightNode = rightNode;
    }
}

这同样适用于Node 类。
另请注意,当 root 不为 null 时,添加 addElement 不会执行任何操作:

 public void addElement(int key, String rId){
        //add element to root node
        if(root == null){

        }
        //what  happens if root != null  ? 
  }

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 2015-06-11
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多