Example #1
0
// RL 회전
BTreeNode * RotateRL(BTreeNode * bst)
{
	BTreeNode * pNode;
	BTreeNode * cNode;

	pNode = bst;
	cNode = GetRightSubTree(pNode);

	ChangeRightSubTree(pNode, RotateLL(cNode));   // 부분적 LL 회전
	return RotateRR(pNode);     // RR 회전
}
Example #2
0
// LL 회전
BTreeNode * RotateLL(BTreeNode * bst)
{
	BTreeNode * pNode;
	BTreeNode * cNode;

	pNode = bst;
	cNode = GetLeftSubTree(pNode);

	ChangeLeftSubTree(pNode, GetRightSubTree(cNode));
	ChangeRightSubTree(cNode, pNode);
	return cNode;
}
BTreeNode* BSTRemove(BTreeNode** pRoot,BSTData target){
	BTreeNode *pVRoot=MakeBTreeNode();
	BTreeNode *pNode=pVRoot;
	BTreeNode *cNode=*pRoot;
	BTreeNode *dNode,*dcNode,*mNode,*mpNode;
	BSTData delData;

	//가상 노드의 오른쪽 자식이 루트노드
	ChangeRightSubTree(pVRoot,*pRoot);

	//삭제 대상 검색
	while(cNode!=NULL && GetData(cNode)!=target){
		pNode=cNode;
		if(target<GetData(cNode)) cNode=GetLeftSubTree(cNode);
		else cNode=GetRightSubTree(cNode);
	}

	if(cNode==NULL) return NULL;
	
	dNode=cNode;

	//단말 노드인 경우
	if(GetLeftSubTree(dNode)==NULL && GetRightSubTree(dNode)==NULL){
		if(GetLeftSubTree(pNode)==dNode) RemoveLeftSubTree(pNode);
		else RemoveRightSubTree(pNode);
	}
	//하나의 자식 노드를 갖는 경우
	else if(GetLeftSubTree(dNode)==NULL || GetRightSubTree(dNode)==NULL){
		if(GetLeftSubTree(dNode)!=NULL) dcNode=GetLeftSubTree(dNode);
		else dcNode=GetRightSubTree(dNode);
		if(GetLeftSubTree(pNode)==dNode) ChangeLeftSubTree(pNode,dcNode);
		else ChangeRightSubTree(pNode,dcNode);
	}
	//두 개의 자식 노드를 갖는 경우
	else{
		//삭제 노드를 대체할 노드는 삭제 노드의 오른쪽 서브트리에서의 가장 작은 값을 가진 노드
		mNode=GetRightSubTree(dNode); //대체노드
		mpNode=dNode;//대체노드의 부모노드
				
		//삭제 대상의 대체 노드를 찾음
		while(GetLeftSubTree(mNode)!=NULL){
			mpNode=mNode;
			mNode=GetLeftSubTree(mNode);
		}
		
		//대체노드에 저장된 값을 삭제할 노드에 저장
		delData=GetData(dNode); //삭제 될 노드 값 백업
		SetData(dNode,GetData(mNode));

		//대체노드의 부모노드와 자식노드를 연결
		if(GetLeftSubTree(mpNode)==mNode) ChangeLeftSubTree(mpNode,GetRightSubTree(mNode));
		else ChangeRightSubTree(mpNode,GetRightSubTree(mNode));
		
		dNode=mNode;
		SetData(dNode,delData);
	}
	//삭제된 노드가 루트노드인 경우	
	if(GetRightSubTree(pVRoot)!=*pRoot) *pRoot=GetRightSubTree(pVRoot);

	free(pVRoot);
	*pRoot=Rebalance(pRoot);
	return dNode;
}