/* 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); }
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); } }