まず、あなたが削除するノードを検索し、する必要があり、検索最初。
ノードのための3つの状況があります削除したいが。
- リーフノード:親ノードのポインタを直接削除してNULLに設定します
- 子ノードが1つしかないノード:親ノードのポインターを子ノードにポイントします
- 2つの子ノードを持つノード:右側のサブツリーの最小要素または左側のサブツリーの最大要素に置き換えます
//定义二叉树
typedef struct TreeNode *BinTree;
typedef BinTree Position;
typedef int ElementType;
struct TreeNode
{
ElementType data;
BinTree left;
BinTree right;
};
//查找最小值
BinTree FindMin(BinTree bst)
{
if(bst)
while(bst->left)
bst=bst->left;
return bst;
}
BinTree Delete(ElementType x,BinTree bst)
{
BinTree tmp;
if(!bst)
cout<<"无该元素";
else if(x<bst->data)
bst->left=Delete(x,bst->left);
else if(x>bst->data)
bst->right=Delete(x,bst->right);
else //找到了
{
if(bst->left&&bst->right) //有左右两个子结点
{
tmp=FindMin(bst->right); //在右子树找到最小值
bst->data=tmp->data; //用最小值替换该值
bst->right=Delete(bst->data,bst->right);//删除右子树的最小值
}
else //无子结点或只有一个
{
tmp=bst;
if(!bst->left) //无左结点
bst=bst->right;
else if(!bst->right) //无右结点
bst=bst->left;
free(tmp);
}
}
return bst;
}