예제 #1
0
void
bitree_remove_right(BiTree *tree, BiTreeNode *node)
{
	BiTreeNode **position;

	/* do not allow removal from an empty tree */
	if (bitree_size(tree) == 0)
		return;

	/* determine where to remove nodes */
	if (node == NULL)
		position = &tree->root;
	else
		position = &node->right;

	/* remove the nodes - recursive */
	if (*position != NULL) {
		bitree_remove_left(tree, *position);
		bitree_remove_right(tree, *position);

		if (tree->destroy != NULL) {
			/* call a user defined function to free dynamically allocated data */
			tree->destroy((*position)->data);
		}

		free(*position);
		*position = NULL;

		/* adjust the size of the tree to account for the remoced node */
		--tree->size;
	}
}
void bitree_remove_right(Bitree *tree, BiTreeNode *node) {
  BiTreeNode **position;

  if (bitree_size(tree) == 0)
    return;

  if (node == NULL)
    position = &tree->root;
  else
    position = &node->right;

  if (*position != NULL) {
    bitree_remove_right(tree, *position);
    bitree_remove_left(tree, *position);
    if (tree->destory != NULL)
      tree->destory((*position)->data);
    free(*position);
    *position = NULL;
    tree->size--;
  }
  return;
}
void bitree_destory(Bitree *tree) {
  bitree_remove_right(tree, NULL);
  memset(tree, 0, sizeof(Bitree));
  return;
}