int main(void) { BTreeNode *N1 = MakeBTreeNode(); BTreeNode *N2 = MakeBTreeNode(); BTreeNode *N3 = MakeBTreeNode(); BTreeNode *N4 = MakeBTreeNode(); BTreeNode *N5 = MakeBTreeNode(); SetData(N1, 1); SetData(N2, 2); SetData(N3, 3); SetData(N4, 4); SetData(N5, 5); MakeLeftSubTree(N1, N2); MakeRightSubTree(N1, N3); MakeLeftSubTree(N3, N4); MakeRightSubTree(N3, N5); printf ( "1의 오른쪽의 왼쪽 : %d\n", GetData( GetLeftSubTree( GetRightSubTree( N1 ) ) ) ); printf ( "1의 오른쪽의 오른쪽 : %d\n", GetData( GetRightSubTree( GetRightSubTree( N1 ) ) ) ); printf ( "N1 후위순회.\n" ); Traverse(N1); printf ( "\n\nN3 후위순회.\n" ); Traverse(N3); return 0; }
// 이진 탐색 트리를 대상으로 데이터 저장(노드의 생성과정 포함) void BSTInsert(BTreeNode ** pRoot, BSTData data) { BTreeNode * pNode = NULL; BTreeNode * cNode = *pRoot; BTreeNode * nNode = NULL; while (cNode != NULL) { if (GetData(cNode) == data) return; pNode = cNode; if (GetData(cNode) > data) cNode = GetLeftSubTree(cNode); else cNode = GetRightSubTree(cNode); } nNode = MakeBTreeNode(); SetData(nNode, data); if (pNode != NULL) { if (GetData(pNode) > data) MakeLeftSubTree(pNode, nNode); else MakeRightSubTree(pNode, nNode); } else { *pRoot = nNode; } }
int main() { BTreeNode * bt1 = MakeBTreeNode(); BTreeNode * bt2 = MakeBTreeNode(); BTreeNode * bt3 = MakeBTreeNode(); BTreeNode * bt4 = MakeBTreeNode(); BTreeNode * bt5 = MakeBTreeNode(); BTreeNode * bt6 = MakeBTreeNode(); SetData(bt1, 1); SetData(bt2, 2); SetData(bt3, 3); SetData(bt4, 4); SetData(bt5, 5); SetData(bt6, 6); MakeLeftSubTree(bt1, bt2); MakeRightSubTree(bt1, bt3); MakeLeftSubTree(bt2, bt4); MakeRightSubTree(bt2, bt5); MakeRightSubTree(bt3, bt6); PreorderTraverse(bt1, ShowInData); printf("\n"); InorderTraverse(bt1, ShowInData); printf("\n"); PostorderTraverse(bt1, ShowInData); printf("\n"); return 0; }
BTreeNode* BSTInsert(BTreeNode **pRoot,BSTData data){ //BTreeNode *pNode=NULL; //BTreeNode *cNode=*pRoot; //BTreeNode *nNode=NULL; ////위치 찾기 //while(cNode!=NULL){ // if(data==GetData(cNode)) return; // pNode=cNode; // if(GetData(cNode)<data) cNode=GetRightSubTree(cNode); // else cNode=GetLeftSubTree(cNode); //} // //nNode=MakeBTreeNode(); //SetData(nNode,data); //if(pNode!=NULL){ //삽입 노드가 루트노드가 아닌 경우 // if(GetData(pNode)<data) MakeRightSubTree(pNode,nNode); // else MakeLeftSubTree(pNode,nNode); //} //else //삽입 되는 노드가 루트 노드가 되는 경우 // *pRoot=nNode; if(*pRoot==NULL){ *pRoot=MakeBTreeNode(); SetData(*pRoot,data); } else if(GetData(*pRoot)>data){ BSTInsert(&((*pRoot)->left),data); *pRoot=Rebalance(pRoot); } else if(GetData(*pRoot)<data){ BSTInsert(&((*pRoot)->right),data); *pRoot=Rebalance(pRoot); } else return NULL; //키(data) 중복 return *pRoot; }
void BSTInsert(BTreeNode ** pRoot, BSTData data) { BTreeNode * pNode = NULL; // parent node BTreeNode * cNode = *pRoot; // current node BTreeNode * nNode = NULL; // new node // 새로운 노드가 추가될 위치를 찾는다. while(cNode != NULL) { if(data == GetData(cNode)) return; // 키의 중복을 허용하지 않음 pNode = cNode; if(GetData(cNode) > data) cNode = GetLeftSubTree(cNode); else cNode = GetRightSubTree(cNode); } // pNode의 서브 노드에 추가할 새 노드의 생성 nNode = MakeBTreeNode(); // 새 노드의 생성 SetData(nNode, data); // 새 노드에 데이터 저장 // pNode의 서브 노드에 새 노드를 추가 if(pNode != NULL) // 새 노드가 루트 노드가 아니라면, { if(data < GetData(pNode)) MakeLeftSubTree(pNode, nNode); else MakeRightSubTree(pNode, nNode); } else // 새 노드가 루트 노드라면, { *pRoot = nNode; } }
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; }