#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10

// Tree node structure
typedef struct _Node *NodePtr;
typedef struct _Node {
    int data;
    NodePtr left;
    NodePtr right;
} Node;

// Function to create a new node
NodePtr new_node(int data) {
    NodePtr node = (NodePtr)malloc(sizeof(Node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// Function to insert a node into the tree
NodePtr insert(NodePtr node, int data) {
    if (node == NULL) return new_node(data);
    if (data < node->data)
        node->left = insert(node->left, data);
    else
        node->right = insert(node->right, data);
    return node;
}

NodePtr insert_skewed(NodePtr node, int data, int skewed_direction) {
    if (node == NULL) return new_node(data);
    if (skewed_direction == 1)
        node->left = insert_skewed(node->left, data, skewed_direction);
    else if (skewed_direction == 2)
        node->right = insert_skewed(node->right, data, skewed_direction);
    return node;
}

// Function to print the tree in preorder
void preorder(NodePtr root) {
    if (root != NULL) {
        printf("%d ", root->data);
        preorder(root->left);
        preorder(root->right);
    }
}

// Function to print the tree in inorder
void inorder(NodePtr root) {
    if (root != NULL) {
        inorder(root->left);
        printf("%d ", root->data);
        inorder(root->right);
    }
}

// Function to print the tree in postorder
void postorder(NodePtr root) {
    if (root != NULL) {
        postorder(root->left);
        postorder(root->right);
        printf("%d ", root->data);
    }
}

// Function to print the tree in level order
void print_level(NodePtr root, int level) {
    if (root == NULL) return;
    if (level == 1)
        printf("%d ", root->data);
    else if (level > 1) {
        print_level(root->left, level - 1);
        print_level(root->right, level - 1);
    }
}

void levelorder(NodePtr root, int height) {
    int i;
	for (i = 1; i <= height; i++)
        print_level(root, i);
}

// Function to get the height of the tree
int get_height(NodePtr root) {
    if (root == NULL) return 0;
    int leftHeight = get_height(root->left);
    int rightHeight = get_height(root->right);
    return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;
}

// Function to perform iterative preorder traversal
void iterative_preorder(NodePtr root) {
    NodePtr stack[SIZE];
    int top = -1;

    if (root != NULL) {
        stack[++top] = root;

        while (top != -1) {
            NodePtr current = stack[top--];
            printf("%d ", current->data);

            if (current->right != NULL) {
                stack[++top] = current->right;
            }

            if (current->left != NULL) {
                stack[++top] = current->left;
            }
        }
    }
}

// Function to perform iterative inorder traversal
void iterative_inorder(NodePtr root) {
    NodePtr stack[SIZE];  // Assuming the maximum stack size is SIZE
    int top = -1;
    NodePtr current = root;

    while (current != NULL || top != -1) {
        while (current != NULL) {
            stack[++top] = current;
            current = current->left;
        }

        current = stack[top--];
        printf("%d ", current->data);

        current = current->right;
    }
}

// Function to perform iterative postorder traversal
void iterative_postorder(NodePtr root) {
    NodePtr stack1[SIZE], stack2[SIZE];
    int top1 = -1, top2 = -1;

    if (root != NULL) {
        stack1[++top1] = root;

        while (top1 != -1) {
            NodePtr current = stack1[top1--];
            stack2[++top2] = current;

            if (current->left != NULL) {
                stack1[++top1] = current->left;
            }

            if (current->right != NULL) {
                stack1[++top1] = current->right;
            }
        }

        while (top2 != -1) {
            printf("%d ", stack2[top2--]->data);
        }
    }
}

// Function to generate random numbers and insert them into the tree
NodePtr generate_tree(int size) {
    int element_in_one_line = 5;

    int range = 100, offset = 1, len = size;
    srand(time(NULL));
    NodePtr root = NULL;
    int i;
	for (i = 0; i < len; i++) {
        int num = rand() % range + offset;
        printf("%d ", num);
        if ((i + 1) % element_in_one_line == 0) printf("\n");
        root = insert(root, num);
    }
    return root;
}

// Function to generate random numbers and insert them into the tree by skewed factor
NodePtr generate_skewed_tree(int size, int skew_factor) {    // 1 for left skewed, 2 for right skewed
    int range = 100, offset = 1;
    int element_in_one_line = 5;
    srand(time(NULL));

    NodePtr root = NULL;
    int i;
	for (i = 0; i < size; i++) {
        int num = rand() % range + offset;

        if (skew_factor == 1) {
            // Insert into left-skewed tree
            root = insert_skewed(root, num, 1);
        } else if (skew_factor == 2) {
            // Insert into right-skewed tree
            root = insert_skewed(root, num, 2);
        }

        printf("%d ", num);
        if ((i + 1) % element_in_one_line == 0) printf("\n");
    }
    return root;
}


int main() {
    // (a) Generate random numbers, print it and insert into the tree
    NodePtr root = generate_skewed_tree(SIZE, 2);    // 1 for left skewed, 2 for right skewed
    printf("\n");

    // (b) Preorder traversal
    printf("Preorder traversal:\n");
    preorder(root);
    printf("\n\n");

    // (c) Inorder traversal
    printf("Inorder traversal:\n");
    inorder(root);
    printf("\n\n");

    // (d) Postorder traversal
    printf("Postorder traversal:\n");
    postorder(root);
    printf("\n\n");

    // (e) Level order traversal
    printf("Level order traversal:\n");
    levelorder(root, get_height(root));
    printf("\n\n");

    // (f) Iterative inorder traversal
    printf("Iterative inorder traversal:\n");
    iterative_inorder(root);
    printf("\n\n");

    // (*) Iterative preorder traversal
    printf("Iterative preorder traversal:\n");
    iterative_preorder(root);
    printf("\n\n");

    // (*) Iterative postorder traversal
    printf("Iterative postorder traversal:\n");
    iterative_postorder(root);
    printf("\n\n");

    return 0;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: