Hello everyone, again trying to help a friend who wrote this code to make a binary tree. It should then show the biggest and smallest number in the tree then delete them and show the last content. Unfortunately this code gives a segmentation error - if anyone could find the problem I would be really grateful. *C only, no C++ please*
Code:
#include<stdio.h>
#include<stdlib.h>
typedef struct treeNode
{
int data;
struct treeNode *leftNodePtr;
struct treeNode *rightNodePtr;
}TreeNode;
typedef TreeNode *TreeNodePtr;
void addNode(TreeNodePtr *treePtr, int value);
void writeInceasingOrder(TreeNodePtr treePtr);
TreeNodePtr findSmallest(TreeNodePtr treePtr);
TreeNodePtr deleteSmallest(TreeNodePtr treePtr);
int main(void)
{
int integer;
TreeNodePtr rootPtr = NULL;
printf("Please enter the integer to add tree");
printf("('-1' to conclude): ");
scanf("%d",&integer);
while(integer != -1)
{
addNode(&rootPtr, integer);
printf("add new integer to tree");
printf("('-1' to conclude): ");
scanf("%d",&integer);
}
writeInceasingOrder(rootPtr);
printf("\ndeleted: %d", (deleteSmallest(rootPtr)->data));
writeInceasingOrder(rootPtr);
return 0;
}
void addNode(TreeNodePtr *treePtr, int value)
{
if(*treePtr == NULL)
{
*treePtr = (TreeNodePtr)malloc(sizeof(TreeNode));
if(*treePtr != NULL)
{
(*treePtr)->data = value;
(*treePtr)->leftNodePtr = NULL;
(*treePtr)->rightNodePtr = NULL;
}
else
{
printf("not enough memory");
}
}
else
{
if(value < (*treePtr)->data)
{
addNode(&((*treePtr)->leftNodePtr), value);
}
else
{
if(value > (*treePtr)->data)
{
addNode(&((*treePtr)->rightNodePtr), value);
}
else
{
printf("this number was added earlier");
}
}
}
}
void writeInceasingOrder(TreeNodePtr treePtr)
{
if(treePtr != NULL)
{
writeInceasingOrder(treePtr->leftNodePtr);
printf("%3d", treePtr->data);
writeInceasingOrder(treePtr->rightNodePtr);
}
}
TreeNodePtr deleteSmallest(TreeNodePtr treePtr)
{
TreeNodePtr tempPtr;
if(treePtr->leftNodePtr != NULL && treePtr->rightNodePtr)
{
tempPtr = findSmallest(treePtr->rightNodePtr);
treePtr->data = tempPtr->data;
treePtr->rightNodePtr = deleteSmallest(treePtr->rightNodePtr);
return treePtr;
}
}
TreeNodePtr findSmallest(TreeNodePtr treePtr)
{
if(treePtr == NULL)
{
return NULL;
}
else
{
if(treePtr->leftNodePtr == NULL)
{
return treePtr;
}
else
{
return findSmallest(treePtr->leftNodePtr);
}
}
}