#include #include #define MAX 10 #define MAXQ 10 // Node structure for binary tree - contains data and pointers to left and right children typedef struct Node { int data; struct Node* lchild; struct Node* rchild; } Node; // Queue structure for level order traversal typedef struct { Node* arr[MAX]; int front; int rear; } queue; // Check if queue is full int isFullq(queue* q) { return (q->rear == MAX-1); } // Check if queue is empty int isEmptyq(queue* q) { return (q->front == -1); } // Add element to queue void enqueue(queue* q, Node* value) { if(isFullq(q)) { printf("Overflow"); return; } else { q->arr[++(q->rear)] = value; if(q->front == -1) { q->front = 0; } } } // Remove and return element from queue Node* dequeue(queue* q) { Node* x; if(isEmptyq(q)) { printf("Underflow"); return NULL; } else if(q->front == q->rear) { x = q->arr[q->front]; q->front = q->rear = -1; return x; } else { x = q->arr[(q->front)++]; return x; } } // Stack structure for iterative traversals typedef struct { Node* arr[MAX]; int top; } STACK; // Check if stack is full int isFull(STACK* s) { return s->top == MAX-1; } // Check if stack is empty int isEmpty(STACK* s) { return s->top == -1; } // Push element onto stack void push(STACK* s, Node* value) { if(isFull(s)) { printf("Stack Overflow"); return; } else { s->arr[++(s->top)] = value; } } // Pop and return element from stack Node* pop(STACK* s) { if(isEmpty(s)) { printf("Stack underflow"); return NULL; } else { return s->arr[(s->top)--]; } } // Create new tree node Node* getNode() { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = 0; newNode->lchild = NULL; newNode->rchild = NULL; return newNode; } // Recursively create binary tree Node* createTree(int item) { if(item != -1) { Node* t = getNode(); t->data = item; int x; printf("Enter the left child of %d (-1 for no child): ", item); scanf("%d", &x); t->lchild = createTree(x); printf("Enter the right child of %d (-1 for no child): ", item); scanf("%d", &x); t->rchild = createTree(x); return t; } return NULL; } // Recursive preorder traversal (Root-Left-Right) void preorder(Node* root) { if(root != NULL) { printf("%d ", root->data); preorder(root->lchild); preorder(root->rchild); } } // Recursive inorder traversal (Left-Root-Right) void inorder(Node* root) { if(root != NULL) { inorder(root->lchild); printf("%d ", root->data); inorder(root->rchild); } } // Recursive postorder traversal (Left-Right-Root) void postorder(Node* root) { if(root != NULL) { postorder(root->lchild); postorder(root->rchild); printf("%d ", root->data); } } // Level order traversal using queue void levelorder(Node* root) { if(root == NULL) return; queue q; q.front = -1; q.rear = -1; Node* t = root; printf("%d ", t->data); enqueue(&q, t); while(!isEmptyq(&q)) { t = dequeue(&q); if(t->lchild) { printf("%d ", t->lchild->data); enqueue(&q, t->lchild); } if(t->rchild) { printf("%d ", t->rchild->data); enqueue(&q, t->rchild); } } } // Iterative preorder traversal using stack void itrpre(Node* root) { STACK s; s.top = -1; Node* t = root; while(t != NULL || !isEmpty(&s)) { if(t != NULL) { printf("%d ", t->data); push(&s, t); t = t->lchild; } else { t = pop(&s); t = t->rchild; } } } // Iterative inorder traversal using stack void itrin(Node* root) { STACK s; s.top = -1; Node* t = root; while(t != NULL || !isEmpty(&s)) { if(t != NULL) { push(&s, t); t = t->lchild; } else { t = pop(&s); printf("%d ", t->data); t = t->rchild; } } } // Iterative postorder traversal using stack void itrpost(Node* root) { STACK s; s.top = -1; Node* t = root; Node* visit = NULL; while(t != NULL || !isEmpty(&s)) { if(t != NULL) { push(&s, t); t = t->lchild; } else { Node* p = s.arr[s.top]; if(p->rchild != NULL && p->rchild != visit) t = p->rchild; else { printf("%d ", p->data); visit = pop(&s); } } } } // Count total number of nodes in tree int count(Node* root) { Node* p = root; int x, y; if(p != NULL) { x = count(p->lchild); y = count(p->rchild); return x + y + 1; } return 0; } // Calculate sum of all node values in tree int sumnodes(Node* root) { Node* p = root; int x, y; if(p != NULL) { x = sumnodes(p->lchild); y = sumnodes(p->rchild); return x + y + p->data; } return 0; } // Search for element in tree int Search(Node* root, int ele) { if(root == NULL) return 0; if(root->data == ele) return 1; if(Search(root->lchild, ele)) return 1; return Search(root->rchild, ele); } // Display menu of operations void displayMenu() { printf("\n=== Binary Tree Operations ===\n"); printf("1. Create a new tree\n"); printf("2. Recursive Preorder Traversal\n"); printf("3. Recursive Inorder Traversal\n"); printf("4. Recursive Postorder Traversal\n"); printf("5. Iterative Preorder Traversal\n"); printf("6. Iterative Inorder Traversal\n"); printf("7. Iterative Postorder Traversal\n"); printf("8. Level Order Traversal\n"); printf("9. Count Nodes\n"); printf("10. Sum of Nodes\n"); printf("11. Search Element\n"); printf("0. Exit\n"); printf("Enter your choice: "); } int main() { Node* root = NULL; int choice, rootnum, searchEle; do { displayMenu(); scanf("%d", &choice); switch(choice) { case 1: printf("Enter data for root node: "); scanf("%d", &rootnum); root = createTree(rootnum); printf("Tree created successfully!\n"); break; case 2: printf("Recursive Preorder Traversal: "); preorder(root); printf("\n"); break; case 3: printf("Recursive Inorder Traversal: "); inorder(root); printf("\n"); break; case 4: printf("Recursive Postorder Traversal: "); postorder(root); printf("\n"); break; case 5: printf("Iterative Preorder Traversal: "); itrpre(root); printf("\n"); break; case 6: printf("Iterative Inorder Traversal: "); itrin(root); printf("\n"); break; case 7: printf("Iterative Postorder Traversal: "); itrpost(root); printf("\n"); break; case 8: printf("Level Order Traversal: "); levelorder(root); printf("\n"); break; case 9: printf("Number of nodes: %d\n", count(root)); break; case 10: printf("Sum of all nodes: %d\n", sumnodes(root)); break; case 11: printf("Enter element to search: "); scanf("%d", &searchEle); if(Search(root, searchEle)) printf("Element found in the tree\n"); else printf("Element not found in the tree\n"); break; case 0: printf("Exiting program...\n"); break; default: printf("Invalid choice! Please try again.\n"); } } while(choice != 0); return 0; }