Upload files to "DS/C/endsem-omnibus"
This commit is contained in:
		
							parent
							
								
									c53746d826
								
							
						
					
					
						commit
						091ec8cd90
					
				
					 4 changed files with 653 additions and 0 deletions
				
			
		
							
								
								
									
										132
									
								
								DS/C/endsem-omnibus/order.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								DS/C/endsem-omnibus/order.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,132 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
// Node structure for binary tree
 | 
			
		||||
struct Node {
 | 
			
		||||
    char data;
 | 
			
		||||
    struct Node *left, *right;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Stack structure for tree construction
 | 
			
		||||
struct Stack {
 | 
			
		||||
    struct Node **array;
 | 
			
		||||
    int top;
 | 
			
		||||
    int capacity;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Function to create a new node
 | 
			
		||||
struct Node* newNode(char data) {
 | 
			
		||||
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
 | 
			
		||||
    node->data = data;
 | 
			
		||||
    node->left = node->right = NULL;
 | 
			
		||||
    return node;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stack operations
 | 
			
		||||
struct Stack* createStack(int capacity) {
 | 
			
		||||
    struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
 | 
			
		||||
    stack->capacity = capacity;
 | 
			
		||||
    stack->top = -1;
 | 
			
		||||
    stack->array = (struct Node**)malloc(stack->capacity * sizeof(struct Node*));
 | 
			
		||||
    return stack;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void push(struct Stack* stack, struct Node* item) {
 | 
			
		||||
    stack->array[++stack->top] = item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct Node* pop(struct Stack* stack) {
 | 
			
		||||
    if (stack->top == -1) return NULL;
 | 
			
		||||
    return stack->array[stack->top--];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Search for index in inorder array
 | 
			
		||||
int search(char arr[], char x, int n) {
 | 
			
		||||
    for (int i = 0; i < n; i++)
 | 
			
		||||
        if (arr[i] == x)
 | 
			
		||||
            return i;
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Build tree from given inorder and preorder traversals
 | 
			
		||||
struct Node* buildTree(char inorder[], char preorder[], int inStart, int inEnd, int* preIndex, int n) {
 | 
			
		||||
    if (inStart > inEnd) return NULL;
 | 
			
		||||
 | 
			
		||||
    struct Node* node = newNode(preorder[*preIndex]);
 | 
			
		||||
    (*preIndex)++;
 | 
			
		||||
 | 
			
		||||
    if (inStart == inEnd) return node;
 | 
			
		||||
 | 
			
		||||
    int inIndex = search(inorder, node->data, n);
 | 
			
		||||
 | 
			
		||||
    node->left = buildTree(inorder, preorder, inStart, inIndex-1, preIndex, n);
 | 
			
		||||
    node->right = buildTree(inorder, preorder, inIndex+1, inEnd, preIndex, n);
 | 
			
		||||
 | 
			
		||||
    return node;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Different traversal functions
 | 
			
		||||
void printPreorder(struct Node* node) {
 | 
			
		||||
    if (node == NULL) return;
 | 
			
		||||
    printf("%c ", node->data);
 | 
			
		||||
    printPreorder(node->left);
 | 
			
		||||
    printPreorder(node->right);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void printInorder(struct Node* node) {
 | 
			
		||||
    if (node == NULL) return;
 | 
			
		||||
    printInorder(node->left);
 | 
			
		||||
    printf("%c ", node->data);
 | 
			
		||||
    printInorder(node->right);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void printPostorder(struct Node* node) {
 | 
			
		||||
    if (node == NULL) return;
 | 
			
		||||
    printPostorder(node->left);
 | 
			
		||||
    printPostorder(node->right);
 | 
			
		||||
    printf("%c ", node->data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert between different traversals
 | 
			
		||||
void convertTraversal(char input[], char type1[], char type2[], int n) {
 | 
			
		||||
    // Create arrays to store traversals
 | 
			
		||||
    char inorder[100], preorder[100];
 | 
			
		||||
    int preIndex = 0;
 | 
			
		||||
 | 
			
		||||
    // If input is preorder, use it directly
 | 
			
		||||
    if (strcmp(type1, "preorder") == 0) {
 | 
			
		||||
        strcpy(preorder, input);
 | 
			
		||||
        strcpy(inorder, type2);
 | 
			
		||||
    }
 | 
			
		||||
    // If input is inorder, use it with preorder
 | 
			
		||||
    else if (strcmp(type1, "inorder") == 0) {
 | 
			
		||||
        strcpy(inorder, input);
 | 
			
		||||
        strcpy(preorder, type2);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Build tree from traversals
 | 
			
		||||
    struct Node* root = buildTree(inorder, preorder, 0, n-1, &preIndex, n);
 | 
			
		||||
 | 
			
		||||
    // Print requested traversal
 | 
			
		||||
    printf("\nConverted traversal: ");
 | 
			
		||||
    if (strcmp(type2, "preorder") == 0)
 | 
			
		||||
        printPreorder(root);
 | 
			
		||||
    else if (strcmp(type2, "inorder") == 0)
 | 
			
		||||
        printInorder(root);
 | 
			
		||||
    else if (strcmp(type2, "postorder") == 0)
 | 
			
		||||
        printPostorder(root);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    // Example usage
 | 
			
		||||
    char input[] = "DBEAFC"; // Input traversal
 | 
			
		||||
    char type1[] = "preorder"; // Type of input traversal
 | 
			
		||||
    char type2[] = "postorder"; // Required output traversal
 | 
			
		||||
    int n = strlen(input);
 | 
			
		||||
 | 
			
		||||
    printf("Input %s traversal: %s\n", type1, input);
 | 
			
		||||
    convertTraversal(input, type1, type2, n);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										79
									
								
								DS/C/endsem-omnibus/queues.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								DS/C/endsem-omnibus/queues.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#define MAX 5
 | 
			
		||||
 | 
			
		||||
int queue[MAX];
 | 
			
		||||
int front = -1, rear = -1;
 | 
			
		||||
 | 
			
		||||
void enqueue() {
 | 
			
		||||
    int item;
 | 
			
		||||
    if(rear == MAX-1) {
 | 
			
		||||
        printf("\nQueue is Full");
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        printf("\nEnter element to insert: ");
 | 
			
		||||
        scanf("%d", &item);
 | 
			
		||||
        if(front == -1 && rear == -1) {
 | 
			
		||||
            front = rear = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            rear++;
 | 
			
		||||
        }
 | 
			
		||||
        queue[rear] = item;
 | 
			
		||||
        printf("\nItem inserted successfully");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dequeue() {
 | 
			
		||||
    if(front == -1 || front > rear) {
 | 
			
		||||
        printf("\nQueue is Empty");
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        printf("\nDeleted element is: %d", queue[front]);
 | 
			
		||||
        if(front == rear) {
 | 
			
		||||
            front = rear = -1;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            front++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display() {
 | 
			
		||||
    int i;
 | 
			
		||||
    if(front == -1 || front > rear) {
 | 
			
		||||
        printf("\nQueue is Empty");
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        printf("\nQueue elements are:\n");
 | 
			
		||||
        for(i = front; i <= rear; i++) {
 | 
			
		||||
            printf("%d ", queue[i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    int choice;
 | 
			
		||||
    while(1) {
 | 
			
		||||
        printf("\n\n1. Insert\n2. Delete\n3. Display\n4. Exit");
 | 
			
		||||
        printf("\nEnter your choice: ");
 | 
			
		||||
        scanf("%d", &choice);
 | 
			
		||||
 | 
			
		||||
        switch(choice) {
 | 
			
		||||
            case 1:
 | 
			
		||||
                enqueue();
 | 
			
		||||
                break;
 | 
			
		||||
            case 2:
 | 
			
		||||
                dequeue();
 | 
			
		||||
                break;
 | 
			
		||||
            case 3:
 | 
			
		||||
                display();
 | 
			
		||||
                break;
 | 
			
		||||
            case 4:
 | 
			
		||||
                exit(0);
 | 
			
		||||
            default:
 | 
			
		||||
                printf("\nInvalid Choice");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										79
									
								
								DS/C/endsem-omnibus/stacks.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								DS/C/endsem-omnibus/stacks.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#define MAX_SIZE 100
 | 
			
		||||
 | 
			
		||||
int top = -1;
 | 
			
		||||
int stack[MAX_SIZE];
 | 
			
		||||
 | 
			
		||||
void push(int c) {
 | 
			
		||||
    if (top < MAX_SIZE - 1) {
 | 
			
		||||
        stack[++top] = c;
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("Stack overflow\n");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int pop() {
 | 
			
		||||
    if (top >= 0) {
 | 
			
		||||
        return stack[top--];
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("Stack underflow\n");
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display() {
 | 
			
		||||
    printf("The stack is: ");
 | 
			
		||||
    for (int i = top; i >= 0; i--) {
 | 
			
		||||
        printf("%d\t", stack[i]);
 | 
			
		||||
    }
 | 
			
		||||
    printf("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int isEmpty() {
 | 
			
		||||
    return top == -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int peek() {
 | 
			
		||||
    if (!isEmpty()) {
 | 
			
		||||
        return stack[top];
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("Stack is empty\n");
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    int choice;
 | 
			
		||||
    while (1) {
 | 
			
		||||
        printf("1. Push\n2. Pop\n3. Display\n4. Peek\n5. Check if Empty\n6. Exit\n");
 | 
			
		||||
        scanf("%d", &choice);
 | 
			
		||||
        switch (choice) {
 | 
			
		||||
            case 1:
 | 
			
		||||
                printf("Enter an element: ");
 | 
			
		||||
                int element;
 | 
			
		||||
                scanf("%d", &element);
 | 
			
		||||
                push(element);
 | 
			
		||||
                break;
 | 
			
		||||
            case 2:
 | 
			
		||||
                printf("The top element is: %d\n", pop());
 | 
			
		||||
                break;
 | 
			
		||||
            case 3:
 | 
			
		||||
                display();
 | 
			
		||||
                break;
 | 
			
		||||
            case 4:
 | 
			
		||||
                printf("The top element is: %d\n", peek());
 | 
			
		||||
                break;
 | 
			
		||||
            case 5:
 | 
			
		||||
                if (isEmpty()) {
 | 
			
		||||
                    printf("Stack is empty\n");
 | 
			
		||||
                } else {
 | 
			
		||||
                    printf("Stack is not empty\n");
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case 6:
 | 
			
		||||
                return 0;
 | 
			
		||||
            default:
 | 
			
		||||
                printf("Invalid choice.\n");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										363
									
								
								DS/C/endsem-omnibus/treefunc.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										363
									
								
								DS/C/endsem-omnibus/treefunc.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,363 @@
 | 
			
		|||
    #include <stdio.h>
 | 
			
		||||
    #include <stdlib.h>
 | 
			
		||||
    #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;
 | 
			
		||||
    }
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue