//总的思路是用待删除的结点的左子树的最大值代替它,就达到删除的目的了。
void BinaryTree::DeleteNode(int data)
{
Node* preNode=NULL;//要删除前的一个结点
Node* pDelNode=root;//要删除的结点
//找到要删除的结点
while (pDelNode!=NULL)
{
if (pDelNode->info==data)
{
break;
}
preNode=pDelNode;
if (pDelNode->info>data)
{
pDelNode=pDelNode->lchild;
}
else
{
pDelNode=pDelNode->rchild;
}
}
if (pDelNode->lchild==NULL)//待删除结点无左子结点
{
if (preNode==NULL)//待删除的是头结点
{
root=root->rchild;
delete pDelNode;
}
else
{
if (preNode->lchild==pDelNode)//待删除的是父结点的左子结点
{
preNode->lchild=pDelNode->rchild;
delete pDelNode;
}
else//待删除的是父结点的右子结点
{
preNode->rchild=pDelNode->rchild;
delete pDelNode;
}
}
}
else//有左子结点,在左子树找最大值的结点来代替它
{
preNode=pDelNode;//保存它的父节点
Node* pMAX=pDelNode->lchild;
while (pMAX->rchild!=NULL)//肯定在右支
{
preNode=pMAX;//保存它的父节点
pMAX=pMAX->rchild;
}
if (preNode==pDelNode)//待删除的结点的左子节点,它无右支结点
{
pDelNode->lchild=pMAX->lchild;
pDelNode->info=pMAX->info;//把它下一个结点的值复制过来
delete pMAX;//删除这个结点
}
else//遍历到最右边,pMAX此时无右子结点
{
pDelNode->info=pMAX->info;//把pMAX的值复制过来
preNode->rchild=pMAX->lchild;
delete pMAX;
}
}
}