Beispiel #1
0
/* TreeTraverseAndDelete -- traverse a tree while deleting nodes 
 *
 * The visitor function must return TRUE to delete the current node,
 * or FALSE to keep it.
 *
 * See <design/arena/#chunk.delete.tricky>.
 */
void TreeTraverseAndDelete(Tree *treeIO, TreeVisitor visitor,
                           void *closureP, Size closureS)
{
  Tree *treeref = treeIO;

  AVER(treeIO != NULL);
  AVERT(Tree, *treeIO);
  AVER(FUNCHECK(visitor));
  /* closureP and closureS are arbitrary */

  TreeToVine(treeIO);

  while (*treeref != TreeEMPTY) {
    Tree tree = *treeref;         /* Current node. */
    Tree *nextref = &tree->right; /* Location of pointer to next node. */
    Tree next = *nextref;         /* Next node. */
    if ((*visitor)(tree, closureP, closureS)) {
      /* Delete current node. */
      *treeref = next;
    } else {
      /* Keep current node. */
      treeref = nextref;
    }
  }
  TreeBalance(treeIO);
}
Beispiel #2
0
void TreeBalance(Tree *treeIO)
{
  Count depth;

  AVER(treeIO != NULL);
  AVERT(Tree, *treeIO);

  depth = TreeToVine(treeIO);

  if (depth > 2) {
    Count n = depth - 1;
    do {
      Count m = n / 2, i;
      Tree *link = treeIO;
      for (i = 0; i < m; ++i) {
        TreeRotateLeft(link);
        link = &((*link)->right);
      }
      n = n - m - 1;
    } while (n > 1);
  }
}