172 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			172 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;
 | |
|     }
 | |
| }
 | 
