Startpunkten
This commit is contained in:
226
Binary_Search_Tree/tree.cpp
Normal file
226
Binary_Search_Tree/tree.cpp
Normal file
@@ -0,0 +1,226 @@
|
||||
//########################################################
|
||||
// TREE.CPP
|
||||
// innehåller funktioner för trädet
|
||||
//========================================================
|
||||
|
||||
class treeClass
|
||||
{
|
||||
public:
|
||||
treeClass();
|
||||
~treeClass(){};
|
||||
ptrType root;
|
||||
ptrType seek(ptrType root, dataType item);
|
||||
bool isEmpty();
|
||||
void insert(ptrType &root,dataType item);
|
||||
void del(ptrType &root,dataType item);
|
||||
void delRoot(ptrType &root);
|
||||
void delLeft(ptrType &root, dataType &item);
|
||||
void preOrder(ptrType treeNode);
|
||||
void inOrder(ptrType treeNode);
|
||||
void postOrder(ptrType treeNode);
|
||||
void save(ptrType root, fstream &fil);
|
||||
};
|
||||
//########################################################
|
||||
// SKAPAR ETT TRÄD & SÄTTER ROOT TILL NULL
|
||||
//========================================================
|
||||
treeClass::treeClass():root(NULL)
|
||||
{
|
||||
}
|
||||
//########################################################
|
||||
// SKAPAR EN NOD
|
||||
//========================================================
|
||||
treeNode::treeNode(dataType item, ptrType L, ptrType R):data(item),left(L),right(R)
|
||||
{
|
||||
}
|
||||
//########################################################
|
||||
// KOLLAR OM DET FINNS NODER I TRÄDET
|
||||
// pre: TRUE
|
||||
// post: TRUE om trädet är tomt
|
||||
// post: FALSE om det finns noder i trädet
|
||||
//========================================================
|
||||
bool treeClass::isEmpty()
|
||||
{
|
||||
if (root==NULL)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
//########################################################
|
||||
// SKRIVER UT TRÄDET I PREORDER
|
||||
// pre: att trädet inte är tomt
|
||||
// post: trädet har skrivits ut i preOrder
|
||||
// calls: preOrder (rekursivt)
|
||||
//========================================================
|
||||
void treeClass::preOrder(ptrType treeNode)
|
||||
{
|
||||
if(treeNode)
|
||||
{
|
||||
cout << " ";
|
||||
cout << treeNode->data;
|
||||
preOrder(treeNode->left);
|
||||
preOrder(treeNode->right);
|
||||
}
|
||||
}
|
||||
//########################################################
|
||||
// SKRIVER UT TRÄDET I INORDER
|
||||
// pre: att trädet inte är tomt
|
||||
// post: trädet har skrivits ut i inOrder
|
||||
// calls: inOrder (rekursivt)
|
||||
//========================================================
|
||||
void treeClass::inOrder(ptrType treeNode)
|
||||
{
|
||||
if(treeNode)
|
||||
{
|
||||
inOrder(treeNode->left);
|
||||
cout << treeNode->data << " ";
|
||||
inOrder(treeNode->right);
|
||||
}
|
||||
}
|
||||
//########################################################
|
||||
// SKRIVER UT TRÄDET I POSTORDER
|
||||
// pre: att trädet inte är tomt
|
||||
// post: trädet har skrivits ut i postOrder
|
||||
// calls: postOrder (rekursivt)
|
||||
//========================================================
|
||||
void treeClass::postOrder(ptrType treeNode)
|
||||
{
|
||||
if(treeNode)
|
||||
{
|
||||
postOrder(treeNode->left);
|
||||
postOrder(treeNode->right);
|
||||
cout << treeNode->data << " ";
|
||||
}
|
||||
}
|
||||
//########################################################
|
||||
// SÖKER EFTER ETT ELEMENT I TRÄDET
|
||||
// pre: att trädet inte är tomt
|
||||
// post: NULL om noden inte fanns
|
||||
// post: sökta värdet om värdet fanns
|
||||
// calls: seek (rekursivt)
|
||||
//========================================================
|
||||
ptrType treeClass::seek(ptrType root, dataType item)
|
||||
{
|
||||
ptrType treeNodeFound;
|
||||
if(root == NULL)
|
||||
treeNodeFound = NULL;
|
||||
else if (root->data == item)
|
||||
treeNodeFound = root;
|
||||
else if (root->data > item)
|
||||
treeNodeFound = seek(root->left, item);
|
||||
else
|
||||
treeNodeFound = seek(root->right, item);
|
||||
return treeNodeFound;
|
||||
}
|
||||
//########################################################
|
||||
// SÄTTER IN EN NOD I TRÄDET
|
||||
// pre: att inmatningen är ett heltal
|
||||
// post: trädet har fått en ny nod insatt
|
||||
// på rätt plats i trädet.
|
||||
// calls: insert (rekursivt)
|
||||
//========================================================
|
||||
void treeClass::insert(ptrType &root,dataType item)
|
||||
{
|
||||
if(root==NULL)
|
||||
root=new treeNode(item,NULL,NULL);
|
||||
else if(item < root->data)
|
||||
insert(root->left,item);
|
||||
else
|
||||
insert(root->right,item);
|
||||
}
|
||||
//########################################################
|
||||
// TAR BORT EN NODEN TILL VÄNSTER
|
||||
// pre: att det finns ett träd
|
||||
// pre: att noden finns
|
||||
// post: noden har tagits ur trädet och
|
||||
// de andra noderna sitter nu rätt placerade
|
||||
// calls: delLeft (rekursivt)
|
||||
//========================================================
|
||||
void treeClass::delLeft(ptrType &root, dataType &item)
|
||||
{
|
||||
if((root != NULL) && (root->left == NULL))
|
||||
{
|
||||
item = root->data;
|
||||
ptrType delPtr = root;
|
||||
root = root->right;
|
||||
delPtr->right = NULL;
|
||||
delete delPtr;
|
||||
}
|
||||
else
|
||||
delLeft(root->left, item);
|
||||
}
|
||||
//########################################################
|
||||
// TAR BORT NODEN OM DEN ÄR EN ROT
|
||||
// pre: att det finns ett träd
|
||||
// pre: att noden finns
|
||||
// post: noden har tagits ur trädet och
|
||||
// de andra noderna sitter nu rätt placerade
|
||||
//========================================================
|
||||
void treeClass::delRoot(ptrType &root)
|
||||
{
|
||||
ptrType delPtr;
|
||||
dataType nyItem;
|
||||
|
||||
if(root != NULL)
|
||||
{
|
||||
if((root->left == NULL) && (root->right == NULL))
|
||||
{
|
||||
delete root;
|
||||
root = NULL;
|
||||
}
|
||||
else if(root->left == NULL)
|
||||
{
|
||||
delPtr = root;
|
||||
root = root->right;
|
||||
delPtr->right = NULL;
|
||||
delete delPtr;
|
||||
}
|
||||
else if(root->right == NULL)
|
||||
{
|
||||
delPtr = root;
|
||||
root = root->left;
|
||||
delPtr->left = NULL;
|
||||
delete delPtr;
|
||||
}
|
||||
else
|
||||
{
|
||||
delLeft(root->right, nyItem);
|
||||
root->data = nyItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
//########################################################
|
||||
// TAR BORT EN NOD UR TRÄDET
|
||||
// pre: att det finns ett träd
|
||||
// pre: att noden finns
|
||||
// post: noden har tagits ur trädet och
|
||||
// de andra noderna sitter nu rätt placerade
|
||||
// calls: delRoot om noden är en rot
|
||||
// calls: del (rekursivt)
|
||||
//========================================================
|
||||
void treeClass::del(ptrType &root, dataType item)
|
||||
{
|
||||
if(item==root->data)
|
||||
delRoot(root);
|
||||
else if(item < root->data)
|
||||
del(root->left, item);
|
||||
else
|
||||
del(root->right,item);
|
||||
}
|
||||
//########################################################
|
||||
// SPARAR TRÄDET PÅ FIL
|
||||
// läser av nodens värde i alla noder i
|
||||
// preorder och skriver de på filen.
|
||||
// pre: att det finns ett träd
|
||||
// post: trädet har sparats på fil
|
||||
// calls: save (rekursivt)
|
||||
//========================================================
|
||||
void treeClass::save(ptrType root, fstream &fil)
|
||||
{
|
||||
if(root)
|
||||
{
|
||||
fil.write((char*)&root->data,sizeof(root));
|
||||
save(root->left,fil);
|
||||
save(root->right,fil);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user