173 lines
4.2 KiB
C
173 lines
4.2 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
// BST Node structure
|
|
typedef struct Node {
|
|
int data;
|
|
struct Node *left;
|
|
struct Node *right;
|
|
} Node;
|
|
|
|
// Function to create a new node
|
|
Node* createNode(int value) {
|
|
Node* newNode = (Node*)malloc(sizeof(Node));
|
|
newNode->data = value;
|
|
newNode->left = NULL;
|
|
newNode->right = NULL;
|
|
return newNode;
|
|
}
|
|
|
|
// Iterative Insert function
|
|
Node* insert(Node* root, int value) {
|
|
// If tree is empty, create root node
|
|
if (root == NULL) return createNode(value);
|
|
|
|
Node* current = root;
|
|
while (1) {
|
|
// If value is less than current node
|
|
if (value < current->data) {
|
|
if (current->left == NULL) {
|
|
current->left = createNode(value);
|
|
break;
|
|
}
|
|
current = current->left;
|
|
}
|
|
// If value is greater than current node
|
|
else if (value > current->data) {
|
|
if (current->right == NULL) {
|
|
current->right = createNode(value);
|
|
break;
|
|
}
|
|
current = current->right;
|
|
}
|
|
// If value already exists
|
|
else break;
|
|
}
|
|
return root;
|
|
}
|
|
|
|
// Iterative Search function
|
|
Node* search(Node* root, int value) {
|
|
Node* current = root;
|
|
|
|
while (current != NULL) {
|
|
// If value found
|
|
if (value == current->data)
|
|
return current;
|
|
// If value is less than current node
|
|
else if (value < current->data)
|
|
current = current->left;
|
|
// If value is greater than current node
|
|
else
|
|
current = current->right;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
// Function to find minimum value node
|
|
Node* findMin(Node* root) {
|
|
if (root == NULL) return NULL;
|
|
|
|
Node* current = root;
|
|
while (current->left != NULL)
|
|
current = current->left;
|
|
return current;
|
|
}
|
|
|
|
// Iterative Delete function
|
|
Node* delete(Node* root, int value) {
|
|
if (root == NULL) return root;
|
|
|
|
Node* current = root;
|
|
Node* parent = NULL;
|
|
|
|
// Find the node to delete and its parent
|
|
while (current != NULL && current->data != value) {
|
|
parent = current;
|
|
if (value < current->data)
|
|
current = current->left;
|
|
else
|
|
current = current->right;
|
|
}
|
|
|
|
// If value not found
|
|
if (current == NULL) return root;
|
|
|
|
// Case 1: Node has no children
|
|
if (current->left == NULL && current->right == NULL) {
|
|
if (current != root) {
|
|
if (parent->left == current)
|
|
parent->left = NULL;
|
|
else
|
|
parent->right = NULL;
|
|
}
|
|
else
|
|
root = NULL;
|
|
free(current);
|
|
}
|
|
|
|
// Case 2: Node has one child
|
|
else if (current->left == NULL || current->right == NULL) {
|
|
Node* child = (current->left) ? current->left : current->right;
|
|
if (current != root) {
|
|
if (parent->left == current)
|
|
parent->left = child;
|
|
else
|
|
parent->right = child;
|
|
}
|
|
else
|
|
root = child;
|
|
free(current);
|
|
}
|
|
|
|
// Case 3: Node has two children
|
|
else {
|
|
Node* successor = findMin(current->right);
|
|
int successorData = successor->data;
|
|
delete(root, successor->data);
|
|
current->data = successorData;
|
|
}
|
|
|
|
return root;
|
|
}
|
|
|
|
// Iterative Inorder traversal
|
|
void inorderTraversal(Node* root) {
|
|
if (root == NULL) return;
|
|
|
|
Node* stack[1000];
|
|
int top = -1;
|
|
Node* current = root;
|
|
|
|
while (current != NULL || top != -1) {
|
|
// Reach the leftmost node
|
|
while (current != NULL) {
|
|
stack[++top] = current;
|
|
current = current->left;
|
|
}
|
|
|
|
current = stack[top--];
|
|
printf("%d ", current->data);
|
|
current = current->right;
|
|
}
|
|
}
|
|
|
|
// Iterative Level Order traversal
|
|
void levelOrder(Node* root) {
|
|
if (root == NULL) return;
|
|
|
|
Node* queue[1000];
|
|
int front = 0, rear = 0;
|
|
queue[rear++] = root;
|
|
|
|
while (front < rear) {
|
|
Node* current = queue[front++];
|
|
printf("%d ", current->data);
|
|
|
|
if (current->left != NULL)
|
|
queue[rear++] = current->left;
|
|
if (current->right != NULL)
|
|
queue[rear++] = current->right;
|
|
}
|
|
}
|