160 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
// Define a TreeNode structure and use a typedef for convenience
 | 
						|
typedef struct TreeNode {
 | 
						|
    int data;
 | 
						|
    struct TreeNode* left;
 | 
						|
    struct TreeNode* right;
 | 
						|
} TreeNode;
 | 
						|
 | 
						|
TreeNode* createNode(int data) {
 | 
						|
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
 | 
						|
    newNode->data = data;
 | 
						|
    newNode->left = NULL;
 | 
						|
    newNode->right = NULL;
 | 
						|
    return newNode;
 | 
						|
}
 | 
						|
 | 
						|
TreeNode* insertNode(TreeNode* root, int data) {
 | 
						|
    if (root == NULL) {
 | 
						|
        return createNode(data);
 | 
						|
    }
 | 
						|
 | 
						|
    if (data < root->data) {
 | 
						|
        root->left = insertNode(root->left, data);
 | 
						|
    } else if (data > root->data) {
 | 
						|
        root->right = insertNode(root->right, data);
 | 
						|
    }
 | 
						|
 | 
						|
    return root;
 | 
						|
}
 | 
						|
 | 
						|
TreeNode* findMinNode(TreeNode* root) {
 | 
						|
    while (root->left != NULL) {
 | 
						|
        root = root->left;
 | 
						|
    }
 | 
						|
    return root;
 | 
						|
}
 | 
						|
 | 
						|
TreeNode* deleteNode(TreeNode* root, int key) {
 | 
						|
    if (root == NULL)
 | 
						|
    {
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    if (key < root->data)
 | 
						|
    {
 | 
						|
        root->left = deleteNode(root->left, key);
 | 
						|
    }
 | 
						|
    else if (key > root->data)
 | 
						|
    {
 | 
						|
        root->right = deleteNode(root->right, key);
 | 
						|
    }
 | 
						|
    else // root is found
 | 
						|
    {
 | 
						|
        if (root->left == NULL)
 | 
						|
        {
 | 
						|
            TreeNode* temp = root->right;
 | 
						|
            free(root);
 | 
						|
            return temp;
 | 
						|
        }
 | 
						|
        else if (root->right == NULL)
 | 
						|
        {
 | 
						|
            TreeNode* temp = root->left;
 | 
						|
            free(root);
 | 
						|
            return temp;
 | 
						|
        }
 | 
						|
 | 
						|
        TreeNode* temp = findMinNode(root->right);
 | 
						|
        root->data = temp->data;
 | 
						|
        root->right = deleteNode(root->right, temp->data);
 | 
						|
    }
 | 
						|
    return root;
 | 
						|
}
 | 
						|
 | 
						|
void inorderTraversal(TreeNode* root) {
 | 
						|
    if (root != NULL) {
 | 
						|
        inorderTraversal(root->left);
 | 
						|
        printf("%d ", root->data);
 | 
						|
        inorderTraversal(root->right);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// Modify the Search function to include position tracking
 | 
						|
int SearchBST(TreeNode *root, int key, int *position) {
 | 
						|
    if (root == NULL) {
 | 
						|
        return 0; // Not found
 | 
						|
    }
 | 
						|
 | 
						|
    int leftCount = SearchBST(root->left, key, position);
 | 
						|
    if (leftCount) {
 | 
						|
        return leftCount; // If found in left subtree
 | 
						|
    }
 | 
						|
 | 
						|
    (*position)++; // Increment position for the current node
 | 
						|
    if (root->data == key) {
 | 
						|
        return *position; // Key found, return position
 | 
						|
    }
 | 
						|
 | 
						|
    return SearchBST(root->right, key, position); // Search in right subtree
 | 
						|
}
 | 
						|
 | 
						|
int main() {
 | 
						|
    TreeNode* root = NULL;
 | 
						|
    int choice, value;
 | 
						|
 | 
						|
    printf("Elements are added to the tree in an inorder sequence.");
 | 
						|
 | 
						|
    while (1) {
 | 
						|
        printf("\nMenu:\n");
 | 
						|
        printf("1. Insert a value\n");
 | 
						|
        printf("2. Delete a value\n");
 | 
						|
        printf("3. Search a value\n");
 | 
						|
        printf("4. Display the Tree (inorder traversal)\n");
 | 
						|
        printf("5. Exit\n");
 | 
						|
        printf("Enter your choice: ");
 | 
						|
        scanf("%d", &choice);
 | 
						|
 | 
						|
        switch (choice) {
 | 
						|
            case 1:
 | 
						|
                printf("Enter a value to insert: ");
 | 
						|
                scanf("%d", &value);
 | 
						|
                root = insertNode(root, value);
 | 
						|
                break;
 | 
						|
 | 
						|
            case 2:
 | 
						|
                printf("Enter a value to delete: ");
 | 
						|
                scanf("%d", &value);
 | 
						|
                root = deleteNode(root, value);
 | 
						|
                break;
 | 
						|
 | 
						|
            case 3: {
 | 
						|
                printf("Enter the element to search: ");
 | 
						|
                scanf("%d", &value);
 | 
						|
                int position = 0;
 | 
						|
                int foundPosition = SearchBST(root, value, &position);
 | 
						|
                if (foundPosition) {
 | 
						|
                    printf("Key found at position: %d\n", foundPosition);
 | 
						|
                } else {
 | 
						|
                    printf("Key not found\n");
 | 
						|
                }
 | 
						|
                break;
 | 
						|
            }
 | 
						|
 | 
						|
            case 4:
 | 
						|
                printf("Inorder traversal: ");
 | 
						|
                inorderTraversal(root);
 | 
						|
                printf("\n");
 | 
						|
                break;
 | 
						|
 | 
						|
            case 5:
 | 
						|
                free(root); // Release memory
 | 
						|
                exit(0);
 | 
						|
 | 
						|
            default:
 | 
						|
                printf("Invalid choice. Please try again.\n");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |