135 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#define MAX 100
 | 
						|
 | 
						|
typedef struct TNode *Tptr;
 | 
						|
typedef struct TNode {
 | 
						|
    int data;
 | 
						|
    Tptr leftchild;
 | 
						|
    Tptr rightchild;
 | 
						|
} TNode;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    Tptr key;
 | 
						|
} element;
 | 
						|
 | 
						|
element Q[MAX];
 | 
						|
int r = -1;
 | 
						|
int f = -1;
 | 
						|
 | 
						|
element dequeue() {
 | 
						|
    element ret = {NULL};
 | 
						|
    if (f != r) {
 | 
						|
        f++;
 | 
						|
        ret = Q[f];
 | 
						|
    }
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
void enqueue(element e) {
 | 
						|
    if (r < MAX - 1) {  // Check if the queue is not full
 | 
						|
        r++;
 | 
						|
        Q[r] = e;
 | 
						|
    } else {
 | 
						|
        printf("Queue is full\n");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// Create nodes in the tree
 | 
						|
Tptr createNode(int val) {
 | 
						|
    Tptr temp = (Tptr)malloc(sizeof(TNode));
 | 
						|
    if (temp) {
 | 
						|
        temp->data = val;
 | 
						|
        temp->leftchild = temp->rightchild = NULL;
 | 
						|
    }
 | 
						|
    return temp;
 | 
						|
}
 | 
						|
 | 
						|
// Create the binary search tree
 | 
						|
void createBST(Tptr *root) {
 | 
						|
    int N, i, val;
 | 
						|
    Tptr current, previous;
 | 
						|
 | 
						|
    printf("Enter the number of nodes: ");
 | 
						|
    scanf("%d", &N);
 | 
						|
 | 
						|
    for (i = 0; i < N; i++) {
 | 
						|
        printf("Enter a unique value: ");
 | 
						|
        scanf("%d", &val);
 | 
						|
 | 
						|
        Tptr temp = createNode(val);
 | 
						|
        if (!temp) {
 | 
						|
            printf("Memory allocation failed\n");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (!*root) {
 | 
						|
            *root = temp;
 | 
						|
        } else {
 | 
						|
            current = *root;
 | 
						|
            previous = NULL;
 | 
						|
            int isDuplicate = 0; // Flag for duplicate
 | 
						|
 | 
						|
            while (current) {
 | 
						|
                previous = current;
 | 
						|
                if (val < current->data) {
 | 
						|
                    current = current->leftchild;
 | 
						|
                } else if (val > current->data) {
 | 
						|
                    current = current->rightchild;
 | 
						|
                } else {
 | 
						|
                    printf("Duplicate. Will only be printed for first occurence.\n");
 | 
						|
                    isDuplicate = 1; // Set flag if duplicate found
 | 
						|
                    break; // Exit loop
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (!isDuplicate) {
 | 
						|
                if (val < previous->data) {
 | 
						|
                    previous->leftchild = temp;
 | 
						|
                } else {
 | 
						|
                    previous->rightchild = temp;
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                free(temp); // Free memory for duplicate node
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// Print in level order
 | 
						|
void levelOrderTraversal(Tptr current) {
 | 
						|
    if (current == NULL) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    element b;
 | 
						|
    b.key = current;
 | 
						|
    enqueue(b);
 | 
						|
 | 
						|
    while (f != r) { // While the queue is not empty
 | 
						|
        Tptr currentNode = dequeue().key;
 | 
						|
        printf("%d ", currentNode->data);
 | 
						|
 | 
						|
        if (currentNode->leftchild != NULL) {
 | 
						|
            b.key = currentNode->leftchild;
 | 
						|
            enqueue(b);
 | 
						|
        }
 | 
						|
 | 
						|
        if (currentNode->rightchild != NULL) {
 | 
						|
            b.key = currentNode->rightchild;
 | 
						|
            enqueue(b);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
int main() {
 | 
						|
    Tptr root = NULL;
 | 
						|
 | 
						|
    createBST(&root);
 | 
						|
 | 
						|
    printf("Level Order Traversal: ");
 | 
						|
    levelOrderTraversal(root);
 | 
						|
    printf("\n");
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |