Files
Programutvecklingsmetodik/Binary_Search_Tree/tree.cpp
2026-03-05 13:44:23 +01:00

227 lines
6.0 KiB
C++

//########################################################
// 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);
}
}