Th
#include <stdio.h>
#include <stdlib.h>
typedef struct ThreadedNode {
int data;
struct ThreadedNode *left, *right;
int rightThread; // 1 if right pointer is a thread, otherwise 0
} ThreadedNode;
// Function prototypes
ThreadedNode* createNode(int data);
ThreadedNode* insert(ThreadedNode* root, int data);
ThreadedNode* leftMost(ThreadedNode* node);
void inorderTraversal(ThreadedNode* root);
void menu();
int main() {
ThreadedNode* root = NULL;
int choice, data;
while (1) {
menu();
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter the data to insert: ");
scanf("%d", &data);
root = insert(root, data);
break;
case 2:
printf("Inorder traversal: ");
inorderTraversal(root);
printf("\n");
break;
case 3:
exit(0);
default:
printf("Invalid choice! Please try again.\n");
}
}
return 0;
}
// Function to create a new node
ThreadedNode* createNode(int data) {
ThreadedNode* newNode = (ThreadedNode*)malloc(sizeof(ThreadedNode));
if (!newNode) {
printf("Memory error\n");
return NULL;
}
newNode->data = data;
newNode->left = newNode->right = NULL;
newNode->rightThread = 0;
return newNode;
}
// Function to insert a node in the threaded binary tree
ThreadedNode* insert(ThreadedNode* root, int data) {
ThreadedNode* newNode = createNode(data);
if (!root) {
return newNode;
}
ThreadedNode* current = root;
ThreadedNode* parent = NULL;
while (current != NULL) {
parent = current;
if (data < current->data) {
if (current->left == NULL) {
break;
}
current = current->left;
} else {
if (current->rightThread) {
break;
}
current = current->right;
}
}
if (data < parent->data) {
parent->left = newNode;
newNode->right = parent;
newNode->rightThread = 1;
} else {
newNode->right = parent->right;
newNode->rightThread = parent->rightThread;
parent->right = newNode;
parent->rightThread = 0;
}
return root;
}
// Function to find the left-most node in a tree/subtree
ThreadedNode* leftMost(ThreadedNode* node) {
while (node != NULL && node->left != NULL) {
node = node->left;
}
return node;
}
// Function for inorder traversal
void inorderTraversal(ThreadedNode* root) {
if (root == NULL) {
return;
}
ThreadedNode* current = leftMost(root);
while (current != NULL) {
printf("%d ", current->data);
if (current->rightThread) {
current = current->right;
} else {
current = leftMost(current->right);
}
}
}
// Function to display the menu
void menu() {
printf("\nMenu:\n");
printf("1. Insert Node\n");
printf("2. Inorder Traversal\n");
printf("3. Exit\n");
}
Comments
Post a Comment