Cài đặt tập hợp bằng cây tìm kiếm nhị phân

Tạo 1 file tên là tknp.cpp với nội dung như sau:


#include <iostream>
#include <malloc.h>

using namespace
std;
typedef
int KeyType;
typedef struct
Node{
KeyType Key;
Node* Left;
Node* Right;
};

typedef
Node* Tree;

void
InsertNode(KeyType X, Tree &T){
if
(T==NULL){
T=(Node*)malloc(sizeof(Node));
T->Key = X;
T->Left = NULL;
T->Right = NULL;
}

else if
( T->Key < X) InsertNode(X,T->Right);
else if
( T->Key > X) InsertNode(X,T->Left);
}

KeyType DeleteMin(Tree &T){
if
(T->Left == NULL)
DeleteMin(T->Left);
else
{
KeyType K = T->Key;
T = T->Right;
return
K;
}
}


void
DeleteNode(KeyType X, Tree &T){
if
(T->Key < X) DeleteNode(X,T->Right);
else if
(T->Key > X) DeleteNode(X,T->Left);
else if
(T->Left == NULL && T->Right==NULL)
T = NULL;
else if
(T->Left == NULL) T=T->Right;
else if
(T->Right == NULL) T=T->Left;
else
T->Key = DeleteMin(T->Right);
}


int
Search(KeyType X, Tree T){
if
(T==NULL) return 0;
if
(T->Key==X) return 1;
if
(T->Key < X) Search(X,T->Right);
else
Search(X,T->Left);
}


void
InOrder(Tree T){
if
(T!=NULL){
InOrder(T->Left);
cout << T->Key<<" ; ";
InOrder(T->Right);
}
}

int
sl=0;
void
InOrder2(Tree T, KeyType *&ds ){
if
(T!=NULL){
InOrder2(T->Left,ds);
ds[sl++]=T->Key;
InOrder2(T->Right,ds);
}
}

int
getAllValue(Tree T,KeyType *&ds){
sl=0;
ds=new KeyType[100];
InOrder2(T, ds );
return
sl;
}


Tiếp tục, tạo 1 file tên taphop.cpp cùng thư mục với file tknp.cpp ở trên, gõ nội dung sau:


#include "tknp.cpp"
typedef KeyType ElementType;
typedef
Tree Set;

void
Insert(ElementType X, Set &S){
InsertNode(X,S);
}

void
Delete(ElementType X, Set &S){
DeleteNode(X,S);
}

int
Member(ElementType X, Set S){
return
Search(X,S);
}

void
PrintSet(Set S){
InOrder(S);
}

#include <conio.h>
Set Union(Set A, Set B){
KeyType *ds;
Set C = NULL;
int
n = getAllValue(A,ds);
for
(int i = 0;i<n;i++) Insert(ds[i],C);
n = getAllValue(B,ds);
for
(int i = 0;i<n;i++) Insert(ds[i],C);
return
C;
}

Set Intersect(Set A, Set B){
Set C = NULL;
KeyType *ds;
int
n = getAllValue(A,ds);
for
(int i = 0;i<n;i++)
if
(Member(ds[i],B))
Insert(ds[i],C);
return
C;
}

Set Sub(Set A, Set B){
Set C = NULL;
KeyType *ds;
int
n = getAllValue(A,ds);
for
(int i = 0;i<n;i++)
if
(!Member(ds[i],B))
Insert(ds[i],C);
return
C;
}

int
Equal(Set A, Set B){
KeyType *dsA,*dsB;
int
n = getAllValue(A,dsA);
int
m = getAllValue(B,dsB);
if
(n!=m) return 0;
for
(int i = 0;i<n;i++)
if
(!Member(dsA[i],B))
return
0;
return
1;
}


int
main(){
Set A=NULL;Set B = NULL; Set C = NULL;
Insert(3,A);Insert(4,A);Insert(7,A);
Insert(6,B);Insert(4,B);Insert(5,B);

cout<<"tap hop A = "; PrintSet(A);
cout<<"\ntap hop B = "; PrintSet(B);
cout<<"\n----------\n";
cout<<"\nUnion(A,B) = "; PrintSet(Union(A,B));
cout<<"\nIntersect(A,B) = "; PrintSet(Intersect(A,B));
cout<<"\nSub(A,B) = "; PrintSet(Sub(A,B));
cout<<"\nEqual (A,B) = "<<Equal(A,B);
PrintSet(C);
}

Bài liên quan

Bài liên quan