64,687
社区成员
发帖
与我相关
我的任务
分享
//删除树中的某一节点
template<typename T>
void __fastcall TMyBTree<T>::DeleteBT(TNode<T>* src,TNode<T>* par)
{
//TODO: Add your source code here
//src代表所要删除的结点,par表示src的父结点
TNode<T>* pTmp; // 保存当前节点
TNode<T>* pTmp2; // 保存当前节点的父节点
//TNode<T>* pTmp3; // 保存当前节点的右子节点
if(NULL == src->lChild && NULL == src->rChild) //此结点为叶子
{
if(m_pRoot == src) //表示src为根节点
m_pRoot = NULL;
else if(par->lChild == src) //为父节点的左子树
par->lChild = NULL;
else //为父节点的右子树
par->rChild = NULL;
SAFEDEL(src);
}
else if(NULL == src->lChild) //只有右子树
{
if(m_pRoot == src) //表示src为根节点
m_pRoot = src->rChild;
else if(par->lChild == src) //为父节点的左子树
par->lChild = src->rChild;
else //为父节点的右子树
par->rChild = src->rChild;
SAFEDEL(src);
}
else if(NULL == src->rChild) //只有左子树
{
if(m_pRoot == src) //表示src为根节点
m_pRoot = src->lChild;
else if(par->lChild == src) //为父节点的左子树
par->lChild = src->lChild;
else //为父节点的右子树
par->rChild = src->lChild;
SAFEDEL(src);
}
else //左右子树都有
{
//遍历到src左子树的前驱节点上
pTmp2 = src;
pTmp = src->lChild;
while(pTmp->rChild != NULL)
{
pTmp2 = pTmp;
pTmp = pTmp->rChild;
}
if(m_pRoot == src)
*m_pRoot = *pTmp2; //将前驱节点赋给根节点
else
*src = *pTmp2;
//if(pTmp->lChild != NULL)
pTmp2->rChild = pTmp->lChild; //正确化前驱节点的父节点指针
//else
// pTmp2->rChild = NULL;
SAFEDEL(pTmp);
}
--m_nSize;
}
template <class T>
void BinarySearchTree<T>::remove(T d){
tree_node *curr,*parent;
curr=root;
parent=root;
//Find the node
while(curr!=NULL){
if(curr->data==d)break;
else if(curr->data>d){
parent=curr;
curr=curr->left;
}
else{
parent=curr;
curr=curr->right;
}
}
if(curr==NULL){
cout<<"Data not found!"<<endl;
return;
}
//Delete a leaf node
if(curr->left==NULL && curr->right==NULL){
if(curr==root){
delete curr;
root=NULL;
}
else if(curr->data>parent->data){
delete curr;
parent->right=NULL;
}
else {
delete curr;
parent->left=NULL;
}
}
//Delete a node with 2 children
else if(curr->left!=NULL && curr->right!=NULL){
//Find the smallest node on the right subtree
tree_node *temp=curr->right;
tree_node *temp_parent=curr;
while(temp->left!=NULL){
temp_parent=temp;
temp=temp->left;
}
//The smallest is a leaf
if(temp->left==NULL && temp->right==NULL){
if(temp_parent!=curr){
temp_parent->left=NULL;
}
else temp_parent->right=NULL;
curr->data=temp->data;
delete temp;
}
//The smallest is a node with only right subtree
else {
if(temp_parent!=curr){
temp_parent->left=temp->right;
}
else temp_parent->right=temp->right;
delete temp;
}
}
//Delete a node with only one subtree
else {
if(curr->left!=NULL){
if(curr->left->data > parent->data){
parent->right=curr->left;
}
else parent->left=curr->left;
}
else{
if(curr->right->data > parent->data){
parent->right=curr->right;
}
else parent->left=curr->right;
}
delete curr;
}
}