Kalp
unknown
plain_text
2 years ago
4.9 kB
10
Indexable
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
struct Node* insert(struct Node* root, int key) {
if (root == NULL) {
return createNode(key);
}
if (key < root->data) {
root->left = insert(root->left, key);
}
else if (key > root->data) {
root->right = insert(root->right, key);
}
return root;
}
struct Node* minValueNode(struct Node* node) {
struct Node* current = node;
while (current->left != NULL) {
current = current->left;
}
return current;
}
struct Node* deleteNode(struct Node* root, int key) {
if (root == NULL) {
return root;
}
if (key < root->data) {
root->left = deleteNode(root->left, key);
}
else if (key > root->data) {
root->right = deleteNode(root->right, key);
}
else {
if (root->left == NULL) {
struct Node* temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL) {
struct Node* temp = root->left;
free(root);
return temp;
}
struct Node* temp = minValueNode(root->right);
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
return root;
}
void inorder(struct Node* root) {
if (root != NULL) {
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
}
void preorder(struct Node* root) {
if (root != NULL) {
printf("%d ", root->data);
preorder(root->left);
preorder(root->right);
}
}
void postorder(struct Node* root) {
if (root != NULL) {
postorder(root->left);
postorder(root->right);
printf("%d ", root->data);
}
}
int findMin(struct Node* root) {
if (root == NULL) {
return -1; // Return -1 to indicate the tree is empty
}
while (root->left != NULL) {
root = root->left;
}
return root->data;
}
int findMax(struct Node* root) {
if (root == NULL) {
return -1; // Return -1 to indicate the tree is empty
}
while (root->right != NULL) {
root = root->right;
}
return root->data;
}
int findSecondMin(struct Node* root, int minVal) {
if (root == NULL) {
return -1; // Return -1 to indicate second minimum does not exist
}
if (root->data == minVal) {
if (root->left == NULL) {
return -1; // No left subtree, so no second minimum
}
int secondMin = findMin(root->left);
if (secondMin == minVal) {
// The left subtree contains only the minimum value, so we need to look in the right subtree.
secondMin = findMin(root->right);
}
return secondMin;
}
else if (root->data > minVal) {
// If the current node's data is greater than minVal, look for second minimum in the left subtree.
int leftSecondMin = findSecondMin(root->left, minVal);
if (leftSecondMin == -1) {
// If left subtree doesn't have a second minimum, check the right subtree.
int rightSecondMin = findSecondMin(root->right, minVal);
return (rightSecondMin != -1) ? rightSecondMin : -1;
}
return leftSecondMin;
}
else {
// The current node's data is less than minVal, so it's not a candidate for the second minimum.
// Look for second minimum in the right subtree.
return findSecondMin(root->right, minVal);
}
}
int main() {
struct Node* root = NULL;
// Insert elements
root = insert(root, 2);
root = insert(root, 9);
root = insert(root, 4);
root = insert(root, 13);
root = insert(root, 7);
root = insert(root, 1);
printf("Inorder Traversal: ");
inorder(root);
printf("\n");
printf("Preorder Traversal: ");
preorder(root);
printf("\n");
printf("Postorder Traversal: ");
postorder(root);
printf("\n");
int minVal = findMin(root);
int maxVal = findMax(root);
printf("Minimum Value: %d\n", minVal);
printf("Maximum Value: %d\n", maxVal);
int secondMin = findSecondMin(root, minVal);
if (secondMin != -1) {
printf("Second Minimum Value: %d\n", secondMin);
} else {
printf("Second Minimum Value does not exist.\n");
}
// Delete elements
root = deleteNode(root, 1);
root = deleteNode(root, 4);
printf("Inorder Traversal after deleting 1 and 4: ");
inorder(root);
printf("\n");
// Clean up memory by freeing allocated nodes
// Note: In a production environment, it's important to free the memory properly.
return 0;
}
Editor is loading...