二叉排序树删除指定结点

来源:互联网 发布:商城美工招聘 编辑:程序博客网 时间:2024/05/23 07:22
//总的思路是用待删除的结点的左子树的最大值代替它,就达到删除的目的了。
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;     }   }}


0 0
原创粉丝点击