// Destroy (free) node recursively. void Xastir_RTreeDestroyNode (struct Node *n) { int i; // fprintf(stderr," Freeing node %lx\n",(unsigned long int) n); if (n->level > 0) { //it is not leaf -> destroy childs for ( i = 0; i < Xastir_NODECARD; i++) { if ( n->branch[i].child ) { Xastir_RTreeDestroyNode ( n->branch[i].child ); } } } // Xastir_RTreeFreeNode( n ); }
// Delete a data rectangle from an index structure. // Pass in a pointer to a Rect, the tid of the record, ptr to ptr to root node. // Returns 1 if record not found, 0 if success. // Xastir_RTreeDeleteRect provides for eliminating the root. // int Xastir_RTreeDeleteRect(struct Rect *R, void *Tid, struct Node**Nn) { register struct Rect *r = R; register void *tid = Tid; register struct Node **nn = Nn; register int i; register struct Node *tmp_nptr=NULL; // Original superliminal.com // source did not initialize. // Code analysis says shouldn't // matter, but let's initialize // to shut up GCC struct ListNode *reInsertList = NULL; register struct ListNode *e; assert(r && nn); assert(*nn); assert(tid >= (void *)0); if (!Xastir_RTreeDeleteRect2(r, tid, *nn, &reInsertList)) { /* found and deleted a data item */ /* reinsert any branches from eliminated nodes */ while (reInsertList) { tmp_nptr = reInsertList->node; for (i = 0; i < MAXKIDS(tmp_nptr); i++) { if (tmp_nptr->branch[i].child) { Xastir_RTreeInsertRect( &(tmp_nptr->branch[i].rect), tmp_nptr->branch[i].child, nn, tmp_nptr->level); } } e = reInsertList; reInsertList = reInsertList->next; Xastir_RTreeFreeNode(e->node); Xastir_RTreeFreeListNode(e); } /* check for redundant root (not leaf, 1 child) and eliminate */ if ((*nn)->count == 1 && (*nn)->level > 0) { for (i = 0; i < Xastir_NODECARD; i++) { tmp_nptr = (*nn)->branch[i].child; if(tmp_nptr) break; } assert(tmp_nptr); Xastir_RTreeFreeNode(*nn); *nn = tmp_nptr; } return 0; } else { return 1; } }