二叉排序树的删除操作
2017-03-02 19:57
239 查看
先来看这个二叉排序树
下面是讨论删除的情况:
我们知道,如果要删除的叶子结点,则可以直接删除。
但如果删除的不是叶子结点呢?
我们知道这个树的中序遍历如下:
也就是说,比如要删除105,则我们可以把104,或108提上去覆盖掉,这样实现了删除,又不保证了他是二叉排序树。
下面是代码
Status DeleteBST(BiTree *T, int key)
{
if( !*T )
{
return FALSE;
}
else
{
if( key == (*T)->data )
{
return Delete(T);
}
else if( key < (*T)->data )
{
return DeleteBST(&(*T)->lchild, key);
}
else
{
return DeleteBST(&(*T)->rchild, key);
}
}
}
Status Delete(BiTree *p)
{
BiTree q, s;
if( (*p)->rchild == NULL )
{
q = *p;
*p = (*p)->lchild;
free(q);
}
else if( (*p)->lchild == NULL )
{
q = *p;
*p = (*p)->rchild;
free(q);
}
else
{
q = *p;
s = (*p)->lchild;
while( s->rchild )
{
q = s;
s = s->rchild;
}
(*p)->data = s->data;
if( q != *p )
{
q->rchild = s->lchild;
}
else
{
q->lchild = s->lchild;
}
free(s);
}
return TRUE;
}
下面是讨论删除的情况:
我们知道,如果要删除的叶子结点,则可以直接删除。
但如果删除的不是叶子结点呢?
我们知道这个树的中序遍历如下:
也就是说,比如要删除105,则我们可以把104,或108提上去覆盖掉,这样实现了删除,又不保证了他是二叉排序树。
下面是代码
Status DeleteBST(BiTree *T, int key)
{
if( !*T )
{
return FALSE;
}
else
{
if( key == (*T)->data )
{
return Delete(T);
}
else if( key < (*T)->data )
{
return DeleteBST(&(*T)->lchild, key);
}
else
{
return DeleteBST(&(*T)->rchild, key);
}
}
}
Status Delete(BiTree *p)
{
BiTree q, s;
if( (*p)->rchild == NULL )
{
q = *p;
*p = (*p)->lchild;
free(q);
}
else if( (*p)->lchild == NULL )
{
q = *p;
*p = (*p)->rchild;
free(q);
}
else
{
q = *p;
s = (*p)->lchild;
while( s->rchild )
{
q = s;
s = s->rchild;
}
(*p)->data = s->data;
if( q != *p )
{
q->rchild = s->lchild;
}
else
{
q->lchild = s->lchild;
}
free(s);
}
return TRUE;
}
相关文章推荐
- 二叉排序树的建立和树中节点的查找删除操作
- 二叉排序树删除操作
- 二叉排序树的查询、插入和删除操作
- 数据结构与算法分析--二叉排序树(二叉查找树,二叉搜索树)的查找、插入和删除操作
- 二叉查找树(二叉排序树)创建,插入,删除操作。
- 数据结构——二叉排序树的插入构造和删除操作
- 数据结构与算法-二叉排序树的删除操作
- 二叉排序树之删除操作
- 二叉排序树之删除操作
- 二叉排序树,建立,查找,删除等操作
- 二叉排序树--查询--插入--删除操作
- 算法基础(七):二叉排序树基本操作-插入、删除(附源代码加注释)
- 二叉排序树的创建,插入和 删除操作
- 二叉排序树的基本操作(建立,中序遍历,查找,删除,插入)
- 二叉排序树的相关操作(插入,查找,删除,遍历等)
- 二叉排序树-删除操作
- 二叉排序树的删除操作 - 数据结构和算法75
- 二叉排序树的创建(结点的插入,删除等操作)
- 二叉排序树(BST)创建,删除,查找操作
- 严蔚敏数据结构中二叉排序树删除操作的问题(与链表比较)