Example #1
0
void AreaTree::recDelete( areaTreeNode * at )
{	if( at == NULL )
		return;

	recDelete( at->left );
	recDelete( at->right );
	
	at = NULL;
}
Example #2
0
void Btree<T>::recDelete(T& x,
                         unsigned ptr,
                         Boolean& found)
//
//
// Purpose: function that performs node deletion.
//
//  Parameters:
//
//    input: x - the data to be removed
//           ptr - the
//
//    output:
//           found - flag that indicates whether item x was found
//
{
    Bstruct<T> *buf, *buf2;
    unsigned i;

    if (ptr == BTREE_NIL)
       found = FALSE;
    else {
      buf = new Bstruct<T>;
      readNode(buf, ptr);
      // search for x in the current node
      found = (searchNode(x, buf, i)) ? TRUE : FALSE;
      // found an element that matches item x?
      if (found) {
        // does ptr point to a leaf node?
        if (buf->nodeLink[i - 1] == BTREE_NIL) {
          // remove element at index i
          trim(buf, i);
          writeNode(buf, ptr);
        }
        else {
          // replace data[i] with its successor in node ptr
          successor(buf, i);
          writeNode(buf, ptr);
          recDelete(buf->data[i], buf->nodeLink[i], found);
        }
      }
      else
        recDelete(x, buf->nodeLink[i], found);

      if (buf->nodeLink[i] != BTREE_NIL) {
        buf2 = new Bstruct<T>;
        readNode(buf2, buf->nodeLink[i]);
        if (buf2->count < BTREE_MIN) {
          restore(buf, i);
          writeNode(buf, ptr);
        }
        delete buf2;
      }
      delete buf;
    }
}
Example #3
0
int recDelete(rect *r, node *n, int pos){
    int i,j;
    node *n1, *n2;
    if(n->leaf){
    	for(i = 0; i < n->size; ++i)
    		if(n->values[i]->child == pos){
            	deleteValue(n, i);
            	writeNode(n);
    			return TRUE;
    		}
    	return FALSE;
    }

    for(i = 0; i < n->size; ++i)
        if(intersect(r, n->values[i]->r)){
            n1 = readNode(n->values[i]->child);

            if(recDelete(r, n1, pos)){
            	n->values[i]->r = dupRect(n1->MBR);
                if(n1->size < b )
                	underflow(n, n1, i);
                else{
                	refreshMBR(n);
                	writeNode(n);
    				freeNode(n1);
                }
                return TRUE;
            }
            else
                freeNode(n1);

        }
    return FALSE;

}
Example #4
0
Boolean Btree<T>::remove(T& x)
//
//
// Purpose: performs node deletion.  The function returns TRUE if
// item x was deleted from the B-tree.
//
//  Parameters:
//
//    input: x - the data to be removed
//
{
    Bstruct<T> *buf = new Bstruct<T>;
    unsigned p;
    Boolean found;

     recDelete(x, root, found);
    if (found) {
      numData--; // decrement data counter
      readNode(buf, root);
      // is the node empty?
      if (buf->count == 0) {
        p = root;
        root = buf->nodeLink[0];
        // delete node at index p
        numDelNodes++; // increment the counter for the number
                       // of deleted nodes
        // does the array delNodeArray need to expand?
        if (numDelNodes == countDelNodeArray)
          expandDelNodeArray();
        // assign index q to an element of array delNodeArray
        *(delNodeArray + numDelNodes - 1) = p;
        // decrement the node counter
        numNodes--;
      }
    }
    delete buf;
    return found;
}
Example #5
0
AreaTree::~AreaTree()
{	recDelete( root );
}