Ejemplo n.º 1
0
    boolean insert(Object x, int parentIndex) {
      if (isFull()) { // If full, you must split and promote splitNode before inserting
        Object splitNode = entries[nrElements / 2].element;
        BTreeNode rightSibling = split();

        if (isRoot()) { // Grow a level
          splitRoot(splitNode, this, rightSibling);
          // Determine where to insert
          if (BTreeSet.this.compare(x, BTreeSet.this.root.entries[0].element) < 0) insert(x, 0);
          else rightSibling.insert(x, 1);
        } else { // Promote splitNode
          parent.insertSplitNode(splitNode, this, rightSibling, parentIndex);
          if (BTreeSet.this.compare(x, parent.entries[parentIndex].element) < 0) {
            return insert(x, parentIndex);
          }
          return rightSibling.insert(x, parentIndex + 1);
        }
      } else if (isLeaf()) { // If leaf, simply insert the non-duplicate element
        int insertAt = childToInsertAt(x, true);
        // Determine if the element already exists
        if (insertAt == -1) {
          return false;
        }
        insertNewElement(x, insertAt);
        BTreeSet.this.size++;
        return true;
      } else { // If not full and not leaf recursively find correct node to insert at
        int insertAt = childToInsertAt(x, true);
        return (insertAt == -1 ? false : entries[insertAt].child.insert(x, insertAt));
      }
      return false;
    }