//总的思路是用待删除的结点的左子树的最大值代替它,就达到删除的目的了。
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; } }}void Bin