#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int DataType_t;
typedef struct BSTreeNode
{
struct BSTreeNode *lchild;
DataType_t KeyVal;
struct BSTreeNode *rchild;
} BSTnode_t;
BSTnode_t *BSTree_Create(DataType_t KeyVal)
{
BSTnode_t *Root = (BSTnode_t *)calloc(1, sizeof(BSTnode_t));
if (Root == NULL)
{
perror("calloc memory for Root is failed");
exit(-1);
}
Root->lchild = NULL;
Root->KeyVal = KeyVal;
Root->rchild = NULL;
return Root;
}
BSTnode_t *BSTree_NewNode(DataType_t KeyVal)
{
BSTnode_t *New = (BSTnode_t *)calloc(1, sizeof(BSTnode_t));
if (New == NULL)
{
perror("calloc memory for New is failed");
return NULL;
}
New->lchild = NULL;
New->KeyVal = KeyVal;
New->rchild = NULL;
return New;
}
bool BSTree_InsertNode(BSTnode_t *Root, DataType_t KeyVal)
{
BSTnode_t *Proot = Root;
BSTnode_t *New = BSTree_NewNode(KeyVal);
if (New == NULL)
{
perror("Create NewNode Error!\n");
return false;
}
if (Root == NULL)
{
Root = New;
}
else
{
while (Proot)
{
if (Proot->KeyVal == New->KeyVal)
{
printf("Can Not Insert\n");
return false;
}
else
{
if (New->KeyVal < Proot->KeyVal)
{
if (Proot->lchild == NULL)
{
Proot->lchild = New;
break;
}
Proot = Proot->lchild;
}
else
{
if (Proot->rchild == NULL)
{
Proot->rchild = New;
break;
}
Proot = Proot->rchild;
}
}
}
}
return true;
}
BSTnode_t *BSTree_Search(BSTnode_t *Root, DataType_t KeyVal)
{
BSTnode_t *Current = Root;
while (Current)
{
if (KeyVal == Current->KeyVal)
{
return Current;
}
else if (KeyVal < Current->KeyVal)
{
Current = Current->lchild;
}
else
{
Current = Current->rchild;
}
}
return NULL;
}
BSTnode_t *BSTree_FindMin(BSTnode_t *Root)
{
if (Root == NULL)
return NULL;
while (Root->lchild)
{
Root = Root->lchild;
}
return Root;
}
BSTnode_t *BSTree_FindMax(BSTnode_t *Root)
{
if (Root == NULL)
return NULL;
while (Root->rchild)
{
Root = Root->rchild;
}
return Root;
}
BSTnode_t *BSTree_DeleteNode(BSTnode_t *Root, DataType_t KeyVal)
{
if (Root == NULL)
return Root;
if (KeyVal < Root->KeyVal)
{
Root->lchild = BSTree_DeleteNode(Root->lchild, KeyVal);
}
else if (KeyVal > Root->KeyVal)
{
Root->rchild = BSTree_DeleteNode(Root->rchild, KeyVal);
}
else
{
if (Root->lchild == NULL)
{
BSTnode_t *temp = Root->rchild;
free(Root);
return temp;
}
else if (Root->rchild == NULL)
{
BSTnode_t *temp = Root->lchild;
free(Root);
return temp;
}
BSTnode_t *temp = BSTree_FindMin(Root->rchild);
Root->KeyVal = temp->KeyVal;
Root->rchild = BSTree_DeleteNode(Root->rchild, temp->KeyVal);
}
return Root;
}
void BSTree_PreOrderTraversal(BSTnode_t *Root)
{
if (Root == NULL)
return;
printf("%d ", Root->KeyVal);
BSTree_PreOrderTraversal(Root->lchild);
BSTree_PreOrderTraversal(Root->rchild);
}
void BSTree_InOrderTraversal(BSTnode_t *Root)
{
if (Root == NULL)
return;
BSTree_InOrderTraversal(Root->lchild);
printf("%d ", Root->KeyVal);
BSTree_InOrderTraversal(Root->rchild);
}
void BSTree_PostOrderTraversal(BSTnode_t *Root)
{
if (Root == NULL)
return;
BSTree_PostOrderTraversal(Root->lchild);
BSTree_PostOrderTraversal(Root->rchild);
printf("%d ", Root->KeyVal);
}
int BSTree_Height(BSTnode_t *Root)
{
if (Root == NULL)
return 0;
int leftHeight = BSTree_Height(Root->lchild);
int rightHeight = BSTree_Height(Root->rchild);
return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;
}
int BSTree_CountNodes(BSTnode_t *Root)
{
if (Root == NULL)
return 0;
return 1 + BSTree_CountNodes(Root->lchild) + BSTree_CountNodes(Root->rchild);
}
void BSTree_Free(BSTnode_t *Root)
{
if (Root == NULL)
return;
BSTree_Free(Root->lchild);
BSTree_Free(Root->rchild);
free(Root);
}
int main()
{
BSTnode_t *Root = BSTree_Create(50);
BSTree_InsertNode(Root, 30);
BSTree_InsertNode(Root, 70);
BSTree_InsertNode(Root, 20);
BSTree_InsertNode(Root, 40);
BSTree_InsertNode(Root, 60);
BSTree_InsertNode(Root, 80);
printf("PreOrder Traversal: ");
BSTree_PreOrderTraversal(Root);
printf("\n");
printf("InOrder Traversal: ");
BSTree_InOrderTraversal(Root);
printf("\n");
printf("PostOrder Traversal: ");
BSTree_PostOrderTraversal(Root);
printf("\n");
BSTnode_t *found = BSTree_Search(Root, 40);
if (found)
{
printf("Found node with value: %d\n", found->KeyVal);
}
else
{
printf("Node not found\n");
}
BSTnode_t *min = BSTree_FindMin(Root);
BSTnode_t *max = BSTree_FindMax(Root);
printf("Min value: %d, Max value: %d\n", min->KeyVal, max->KeyVal);
printf("Tree height: %d\n", BSTree_Height(Root));
printf("Total nodes: %d\n", BSTree_CountNodes(Root));
printf("Deleting node 20\n");
Root = BSTree_DeleteNode(Root, 20);
printf("InOrder Traversal after deletion: ");
BSTree_InOrderTraversal(Root);
printf("\n");
BSTree_Free(Root);
return 0;
}