Fixed Leverington Issues, resolve still no worky

+- PA08_Main
+- RedBlackTreeUtility.c
This commit is contained in:
Charles Descamps 2023-10-31 19:07:47 -07:00
parent c2068d6874
commit 9c24cee2df
2 changed files with 23 additions and 22 deletions

Binary file not shown.

View file

@ -37,14 +37,9 @@ Dependencies: free
*/
RedBlackNodeType *clearTree(RedBlackNodeType *localPtr)
{
// recurse through the left children
if (localPtr->leftChildPtr != NULL)
if(localPtr->leftChildPtr != NULL && localPtr->rightChildPtr != NULL)
{
clearTree(localPtr->leftChildPtr);
}
// recurse through the right children
if (localPtr->rightChildPtr != NULL)
{
clearTree(localPtr->rightChildPtr);
}
// otherwise, free the local pointer if at end of getting to bottom tree
@ -99,7 +94,7 @@ RedBlackNodeType *createNodeFromData(char data, int nodeColor)
// define a new node
RedBlackNodeType *newNode;
// allocate memory for the newNode (RedBlackNodeType)
newNode = malloc(sizeof(RedBlackNodeType));
newNode = (RedBlackNodeType*)malloc(sizeof(RedBlackNodeType));
// define the color as the new node's color
newNode->color = nodeColor;
// define the data of the new node to be the input data
@ -290,6 +285,7 @@ Dependencies: getMax
*/
int findTreeHeight(RedBlackNodeType *localPtr)
{
int leftTreeSize, rightTreeSize;
// check to see if at null
if(localPtr == NULL)
{
@ -299,8 +295,8 @@ int findTreeHeight(RedBlackNodeType *localPtr)
else
{
// traverse the left and right subtrees
int leftTreeSize = findTreeHeight(localPtr->leftChildPtr);
int rightTreeSize = findTreeHeight(localPtr->rightChildPtr);
leftTreeSize = findTreeHeight(localPtr->leftChildPtr);
rightTreeSize = findTreeHeight(localPtr->rightChildPtr);
// return the max of the subtrees, add one for the local node
return getMax(leftTreeSize, rightTreeSize) + 1;
}
@ -398,7 +394,6 @@ RedBlackNodeType *insertHelper(RedBlackNodeType *wkgPtr, char inData)
// return recursion
return insertHelper(wkgPtr->leftChildPtr, inData);
}
// otherwise, check for moving right (diffChar > 0)
else if(diffChar > 0)
{
@ -413,13 +408,9 @@ RedBlackNodeType *insertHelper(RedBlackNodeType *wkgPtr, char inData)
// return recursion
return insertHelper(wkgPtr->rightChildPtr, inData);
}
// otherwise, there is a duplicate
else
{
// return NULL
return NULL;
}
}
/*
@ -455,6 +446,7 @@ Dependencies: printf, rotateLeft, rotateRight, swapColors,
*/
void resolveRBT(RedBlackNodeType **treeRoot, RedBlackNodeType *wkgPtr)
{
printf("\nAttempting to Resolve RBT\n");
// declare parPtr, grndParPtr, unclePtr, grtGrndPtr
RedBlackNodeType *wkgParentPtr;
RedBlackNodeType *wkgGrandParentPtr;
@ -463,10 +455,11 @@ void resolveRBT(RedBlackNodeType **treeRoot, RedBlackNodeType *wkgPtr)
// check for parent and grandparent exists
if(wkgPtr->parentPtr != NULL && wkgPtr->parentPtr->parentPtr != NULL)
{
printf("\nStarting resolution process.\n");
// set all my relatives, will need to know which child I am
wkgParentPtr = wkgPtr->parentPtr;
wkgGrandParentPtr = wkgParentPtr->parentPtr;
if (wkgParentPtr->leftChildPtr->data == wkgPtr->data)
if (wkgParentPtr->leftChildPtr == wkgPtr)
{
// set the uncle pointer to the parent's right child
wkgUnclePtr = wkgParentPtr->rightChildPtr;
@ -492,10 +485,10 @@ void resolveRBT(RedBlackNodeType **treeRoot, RedBlackNodeType *wkgPtr)
else
{
// check for parent is left of grandparent
if(wkgGrandParentPtr->leftChildPtr->data == wkgParentPtr->data)
if(wkgGrandParentPtr->leftChildPtr == wkgParentPtr)
{
// check for child is left of parent (Left Left case)
if(wkgParentPtr->leftChildPtr->data == wkgPtr->data)
if(wkgParentPtr->leftChildPtr == wkgPtr)
{
printf("\nLL Case, rotate right\n");
// use rotate right with grandparent(old) and parent(new)
@ -503,7 +496,7 @@ void resolveRBT(RedBlackNodeType **treeRoot, RedBlackNodeType *wkgPtr)
// swap colors called with parent and grandparent
}
// check for child is right of parent (Left Right case)
if(wkgParentPtr->rightChildPtr->data == wkgPtr->data)
else
{
printf("\nLR Case, rotate right, recurse\n");
// use rotate right with parent(old) and createdNode(new)
@ -511,10 +504,10 @@ void resolveRBT(RedBlackNodeType **treeRoot, RedBlackNodeType *wkgPtr)
}
}
// check for parent is right of grandparent
if(wkgGrandParentPtr->rightChildPtr->data == wkgParentPtr->data)
else
{
// check for child is right of parent (Right Right case)
if(wkgParentPtr->rightChildPtr->data == wkgPtr->data)
if(wkgParentPtr->rightChildPtr == wkgPtr)
{
printf("\nRR Case, rotate left\n");
// use rotate left with grandparent(old) and parent(new)
@ -522,7 +515,7 @@ void resolveRBT(RedBlackNodeType **treeRoot, RedBlackNodeType *wkgPtr)
// swap colors called with parent and grandparent
}
// check for child is left of parent (Right Left case)
if(wkgParentPtr->leftChildPtr->data == wkgPtr->data)
else
{
printf("\nRL Case, rotate left, recurse\n");
// use rotate left with parent(old) and createdNode(new)
@ -538,6 +531,14 @@ void resolveRBT(RedBlackNodeType **treeRoot, RedBlackNodeType *wkgPtr)
// paint it black
wkgPtr->color = BLACK;
}
// print out the structure, version data
displayTreeStructure(*treeRoot, NODE_DATA);
// print the thin divider
displayDivider(*treeRoot, THIN_DIVIDER);
// print out the structure, version color
displayTreeStructure(*treeRoot, NODE_COLOR);
// print the thick divider
displayDivider(*treeRoot, THICK_DIVIDER);
// no return, void.
}