132 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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;
 | |
| }
 | 
