二分探索木の削除

まず、あなたが削除するノードを検索し、する必要があり、検索最初。
ノードのための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; 
} 

おすすめ

転載: blog.csdn.net/m0_54621932/article/details/114144424