struct treenode
{
elementtype element;
tree left;
tree right;
};
typedef struct treenode bintree;
bintree Delete(elementtype x,bintree bst)
{
position tmp;
if(!bst)
printf("要删除的元素未找到");
else if(x < bst->data)
bst->left = Delete(x, bst->left); //左子树递归删除
else if(x > bst->data)
bst->right = Delete(x, bst->right); //右子树递归删除
else //找到要删除的节点
{
if(bst->left && bst->right) //被删除节点有左右两个子节点
{
tmp = findmin(bst->right); //在右子树中找最小的元素填充删除节点
bst->data = tmp->data;
bst->right = Delete(bst->data, bst->right); //再删除节点的右子树中删除最小元素
}
else //被删除节点有一个或无子节点
{
tmp = bst;
if( !bst->left) //有右孩子或无子节点
bst = bst->right;
else( !bst->right) //有左孩子或无子节点
bst = bst->left;
free(tmp);
}
}
return bst;
}
bintree insert(elementtype x, bintree bst)
{
if(!bst) //若原树为空,生成并返回一个节点的二叉搜索树
{
bst = malloc(sizeof(struct treenode));
bst->data = x;
bst->left = bst->right = NULL;
}
else //开始找要插入的元素位置
{
if(x < bst->data)
bst->left = insert(x, bst->left); //递归插入左子树
else if(x > bst->data)
bst->right = insert(x, bst->right); //递归插入右子树
}
return bst;
}