From 4e14a80b8dfd830fe8389198ec023f6f74fce55a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 5 Sep 2021 13:31:21 -0500 Subject: [PATCH] git migration --- README.md | 3 +- app/binaryTree | Bin 0 -> 84776 bytes app/binaryTree.cpp | 402 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 404 insertions(+), 1 deletion(-) create mode 100755 app/binaryTree create mode 100644 app/binaryTree.cpp diff --git a/README.md b/README.md index 0ae2594..89b9494 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# binarysearchtree +# BinarySearchTree +A basic implementation of a binary search tree in c++ \ No newline at end of file diff --git a/app/binaryTree b/app/binaryTree new file mode 100755 index 0000000000000000000000000000000000000000..1b40edcefff3844db8127e7e519d668f7779d95f GIT binary patch literal 84776 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
d-f@ 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 literal 0 HcmV?d00001 diff --git a/app/binaryTree.cpp b/app/binaryTree.cpp new file mode 100644 index 0000000..92c6a1e --- /dev/null +++ b/app/binaryTree.cpp @@ -0,0 +1,402 @@ +/* ################################# + # Programmer: Tim Glasgow # + # Date Started: March 15, 2016 # + # Last Commit: March 18, 2016 # + # Purpose: Implement simple BST # + # Environment: Linux/GNU # + # Version: 1.0.3 # + ################################# +*/ + +#include +#include +#include +using namespace std; + + +/* #################################### + # Name: printStuff # + # Signature: 1a # + # Purpose: Make cout more readable # + #################################### +*/ +void printStuff(string output, unsigned char numericCharacter, unsigned char mode) +{ + if (mode == 0) + { + cout << output << endl; + + return; + } //end if + + else + { + cout << output << (int)numericCharacter << endl; + return; + } //end else +} //end printStuff + + +/* #################################### + # Name: node # + # Signature: 1b # + # Purpose: Implement tree node # + #################################### +*/ +class node +{ + public: + unsigned char key; + node *parent = NULL; + node *leftChild = NULL; + node *rightChild = NULL; + + bool isRoot; //0 is not root, 1 is root + bool side; //0 for left of parent, 1 for right of parent + bool parentEmpty() const { return parent==NULL; } + bool leftEmpty() const { return leftChild==NULL; } + bool rightEmpty() const { return rightChild==NULL; } + +}; //end class Node + + +/* #################################### + # Name: binaryTree # + # Signature: 1c # + # Purpose: Implement all functions # + # of a binary search tree # + #################################### +*/ +class binaryTree +{ + public: + node *root = NULL; + bool rootEmpty() const { return root==NULL; } + + +/* #################################### + # Name: insertNode # + # Signature: 1c-a # + # Purpose: Insert node into tree # + #################################### +*/ + binaryTree insertNode( binaryTree &theTree, node &insertion, node *examinedNode, unsigned char keyIn ) + { + if ( theTree.rootEmpty()) + { + insertion.key = keyIn; + insertion.isRoot = 1; + theTree.root = &insertion; + return theTree; //end if + }//end if + else + { + if ( examinedNode->key <= keyIn ) + { + if (examinedNode->rightEmpty()) + { + insertion.key = keyIn; + insertion.side = 1; + insertion.isRoot = 0; + examinedNode->rightChild = &insertion; + examinedNode->rightChild->parent = examinedNode; + return theTree; + }//end 2nd nested if + else + { + theTree = theTree.insertNode( theTree, insertion, examinedNode->rightChild, keyIn); + return theTree; + }//end 2nd nested else + }//end nested if + else + { + if (examinedNode->leftEmpty()) + { + insertion.key = keyIn; + insertion.side = 0; + insertion.isRoot = 0; + examinedNode->leftChild = &insertion; + examinedNode->leftChild->parent = examinedNode; + return theTree; + }//end 2nd nested if + else + { + theTree = theTree.insertNode( theTree, insertion, examinedNode->leftChild, keyIn); + return theTree; + }//end 2nd nested else + }//end nested else + }//end else + + return theTree; + }//end insertNode + + +/* ##################################### + # Name: searchTree # + # Signature: 1c-b # + # Purpose: Find and return key node # + ##################################### +*/ + node *searchTree( binaryTree &theTree, node *searchedNode, unsigned char keySearch ) + { + if ( theTree.rootEmpty() ){ + printStuff("Empty tree, no values found", 0, 0); //1a + return searchedNode; + }//end if + + if ( searchedNode->key == keySearch) + { + printStuff ("value found", 0, 0); //1a + node *returnedNode = searchedNode; //1b + searchedNode = NULL; + return returnedNode; + }//end if + else + { + if ( (searchedNode->key < keySearch) && !(searchedNode->rightEmpty()) ) + { + searchedNode = searchTree( theTree, searchedNode->rightChild, keySearch); //1c-b + return searchedNode; + }//end nested if + else if ( (searchedNode->key > keySearch) && !(searchedNode->leftEmpty()) ) + { + searchedNode = searchTree( theTree, searchedNode->leftChild, keySearch); //1c-b + return searchedNode; + }//end nested else-if + }//end else + + printStuff("value not found", 0, 0); //1a + }//end searchTree + + +/* ###################################### + # Name: deleteNode # + # Signature: 1c-c # + # Purpose: Remove key node from tree # + ###################################### +*/ + binaryTree deleteNode( binaryTree &theTree, node *deletionNode, unsigned char keyDel ) + { + if ( theTree.rootEmpty()) + { + printStuff("Deletion node not found in tree", 0, 0); + return theTree; //end if + }//end if + else + { + deletionNode = theTree.searchTree( theTree, deletionNode, keyDel ); //1b, 1c-b + }//end else + + if ( (deletionNode->leftEmpty()) && (deletionNode->rightEmpty()) ) + { + printStuff("Children are empty, deleting node", 0, 0); //1a + if(!deletionNode->isRoot) + { + if (deletionNode->side) + { + deletionNode->parent->rightChild = NULL; + }//end 2nd nested if + else + { + deletionNode->parent->leftChild = NULL; + }//end 2nd nested else + }//end nested if + else + { + printStuff("the tree is now empty", 0, 0); //1a + theTree.root = NULL; + }//end nested else + deletionNode->parent = NULL; + return theTree; + }//end if + + if ( deletionNode->leftEmpty() && !deletionNode->rightEmpty() ) + { + printStuff("Has right child, deleting node", 0, 0); //1a + if(!deletionNode->isRoot) + { + if (deletionNode->side) + { + deletionNode->parent->rightChild = deletionNode->rightChild; + deletionNode->parent->rightChild->side = deletionNode->side; + deletionNode->rightChild->parent = deletionNode->parent; + }//end 2nd nested if + else + { + deletionNode->parent->leftChild = deletionNode->rightChild; + deletionNode->rightChild->parent = deletionNode->parent; + deletionNode->parent->leftChild->side = deletionNode->side; + }//end 2nd nested else + }//end nested if + else + { + deletionNode->rightChild->isRoot = 1; + deletionNode->rightChild->parent = NULL; + theTree.root = deletionNode->rightChild; + }//end nested else + + deletionNode->parent = NULL; + return theTree; + }//end if + + if ( !deletionNode->leftEmpty() && deletionNode->rightEmpty() ) + { + printStuff("Has left child, deleting node", 0, 0); + if(!deletionNode->isRoot) + { + if (deletionNode->side) + { + deletionNode->parent->rightChild = deletionNode->leftChild; + deletionNode->rightChild->parent = deletionNode->parent; + deletionNode->parent->rightChild->side = deletionNode->side; + }//end 2nd nested if + else + { + deletionNode->parent->leftChild = deletionNode->leftChild; + deletionNode->leftChild->parent = deletionNode->parent; + deletionNode->parent->leftChild->side = deletionNode->side; + }//end 2nd nested else + }//end nested if + else + { + deletionNode->leftChild->isRoot = 1; + deletionNode->leftChild->parent = NULL; + theTree.root = deletionNode->leftChild; + }//end nested else + deletionNode->parent = NULL; + return theTree; + }//end if + + if ( !deletionNode->leftEmpty() && !deletionNode->rightEmpty() ) + { + printStuff("Has two children, deleting node and replacing with right minimum", 0, 0); //1a + node *rightMin = theTree.findRightMin(deletionNode->rightChild); //1b, 1c-d + unsigned char tempKey = rightMin->key; + rightMin = deletionNode; + rightMin->key = tempKey; + }//end if + + return theTree; + }//end deleteNode + + +/* #################################### + # Name: findRightMin # + # Signature: 1c-d # + # Purpose: Find min value in right # + # sub-tree # + #################################### +*/ + node *findRightMin(node *minNode) + { + if( minNode->leftEmpty() ) + { + node *returnedNode = minNode; //1b + minNode = NULL; + return returnedNode; + }//end if + else + { + minNode = findRightMin(minNode->leftChild); //1c-d + return minNode; + }//end else + }//end minNode; + + +}; //end class binaryTree + + +int main() +{ + printStuff("program initialized", 0, 0); //1a + + printStuff("creating the tree", 0, 0); //1a + binaryTree myTree; //1c + printStuff("tree created" ,0 ,0); //1a + + printStuff("creating insertion nodes" ,0 ,0); //1a + node insertionNode[128]; //1b + printStuff("node created", 0, 0); //1a + + printStuff("inserting nodes", 0, 0); //1a + + myTree = myTree.insertNode(myTree, insertionNode[24], myTree.root, 25); //1c-a + printStuff("Tree Root Value is Now: ", myTree.root->key, 1); //1a + + printStuff("Inserting nodes", 0, 0); //1a + myTree = myTree.insertNode(myTree, insertionNode[0], myTree.root, 3); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[1], myTree.root, 7); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[2], myTree.root, 2); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[3], myTree.root, 4); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[4], myTree.root, 5); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[5], myTree.root, 6); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[6], myTree.root, 9); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[7], myTree.root, 1); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[8], myTree.root, 8); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[9], myTree.root, 10); //1c-a + + myTree = myTree.insertNode(myTree, insertionNode[10], myTree.root, 13); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[11], myTree.root, 17); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[12], myTree.root, 12); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[13], myTree.root, 14); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[14], myTree.root, 15); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[15], myTree.root, 16); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[16], myTree.root, 19); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[17], myTree.root, 11); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[18], myTree.root, 18); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[19], myTree.root, 20); //1c-a + + myTree = myTree.insertNode(myTree, insertionNode[20], myTree.root, 23); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[21], myTree.root, 27); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[22], myTree.root, 22); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[23], myTree.root, 24); //1c-a + //myTree = myTree.insertNode(myTree, insertionNode[24], myTree.root, 25); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[25], myTree.root, 26); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[26], myTree.root, 29); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[27], myTree.root, 21); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[28], myTree.root, 28); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[29], myTree.root, 30); //1c-a + + myTree = myTree.insertNode(myTree, insertionNode[30], myTree.root, 33); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[31], myTree.root, 37); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[32], myTree.root, 32); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[33], myTree.root, 34); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[34], myTree.root, 35); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[35], myTree.root, 36); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[36], myTree.root, 39); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[37], myTree.root, 31); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[38], myTree.root, 38); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[39], myTree.root, 40); //1c-a + + myTree = myTree.insertNode(myTree, insertionNode[40], myTree.root, 43); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[41], myTree.root, 47); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[42], myTree.root, 42); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[43], myTree.root, 44); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[44], myTree.root, 45); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[45], myTree.root, 46); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[46], myTree.root, 49); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[47], myTree.root, 41); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[48], myTree.root, 48); //1c-a + myTree = myTree.insertNode(myTree, insertionNode[49], myTree.root, 50); //1c-a + + for (unsigned char i = 0; i < 50; i++) + { + printStuff("Searching for: ", i+1, 1); //1a + myTree.searchTree( myTree, myTree.root, i+1); //1c-b + }//end for loop + + for (unsigned char i = 0; i < 50; i++) + { + printStuff("Deleting key: ", i+1, 1); //1a + myTree = myTree.deleteNode(myTree, myTree.root, i+1); //1c-c + if(!myTree.rootEmpty() ) + printStuff("Root value is now: ", myTree.root->key, 1); //1a + }//end for loop + + for (unsigned char i = 0; i < 50; i++) + { + printStuff("Searching for: ", i+1, 1); //1a + myTree.searchTree( myTree, myTree.root, i+1); //1c-b + }//end for loop + +} //end main