标签:
二叉搜索树的删除:
在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除。
分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点
void Delete(BinTree*& root,int value)
{
BinTree* delnode= NULL;
if(root == NULL)
return ;
BinTree* temp = root;
BinTree* parent =NULL;
while(temp!=NULL)
{
if(temp->value == value)
break;
else
{
parent = temp;
if(temp->value >value)
temp = temp->left;
else
temp =temp->right;
}
}
if(temp ==NULL)
return ;
delnode = temp;
// 删除的节点被找到 根据被删除的节点的情况来判断
// 如果节点的没有孩子 那么直接删除此节点
if(delnode->right ==NULL && delnode->left ==NULL)
{
cout<<"==="<<endl;
//cout<<parent->value<<endl;
if(delnode == root)
{
root=NULL;
}
if(parent && parent->left == delnode)
{
parent->left = NULL;
}
if(parent && parent->right == delnode)
parent->right =NULL;
delete delnode;
}
//如果此节点有一个孩子
if(delnode->right != NULL && delnode->left==NULL)
{
if(parent !=NULL)
{
if(parent->left == delnode)
parent->left = delnode->right;
else if(parent->right == delnode)
parent->right = delnode->right;
}
else
{
root = delnode->right;
}
delete delnode;
}
if(delnode->left !=NULL&&delnode->right== NULL)
{
if(parent !=NULL)
{
if(parent->left == delnode)
parent->left = delnode->left;
else if(parent->right = delnode)
parent->right = delnode->right;
}
else
{
root = delnode->left;
}
delete delnode;
}
//两个节点都不为空
if(delnode->left !=NULL && delnode->right !=NULL)
{
temp = delnode->right;
parent = delnode;
while(temp->left !=NULL)
{
parent = temp;
temp = temp->left;
}
delnode->value = temp->value;
parent->left = temp->right;
delete temp;
//Delete(delnode->right,temp->value);
}
} 标签:
原文地址:http://blog.csdn.net/yusiguyuan/article/details/42870445