Q1 Tree

Please design a binary tree using linked list structure in C language with the following requirements: Design a main menu with 5 options:

請以用C語言的串列結構的宣告方式設計一個二元樹, 設計的需求如下: 設計一個主選單,選單內容包含5種選項:

  1. Input 15 data values manually.

  2. Generate 15 data values randomly.

  3. Display the set of 15 data values.

  4. Display root, left subtree, and right subtree. O. Exit the program by entering 0. Note: The first input value serves as the root. Values less than or equal to the root are placed in the left subtree, while values greater than the root are placed in the right subtree.

  5. 手動輸入資料 2.亂數產生15個資料 3.顯示15個資料集; 4.顯示二元樹的結果,並分別以樹根,左子樹,右子樹依序顯示其值

  6. 按0結束程式執行 PS. 輸入的第1個值為樹根,小於或等於樹根的值放左子樹,比樹根大放右子樹

Untitled

Untitled

My Code:

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

// Define the Tree structure
struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
};

struct TreeNode* root = NULL;

// Function to create a new TreeNode
struct TreeNode* createNode(int data) {
    struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    newNode->data = data;
    newNode->left = newNode->right = NULL;
    return newNode;
}

// Function to insert a node in the binary tree
void insertNode(int data, struct TreeNode** node) {
    if (*node == NULL) {
        *node = createNode(data);
        return;
    }

    if (data <= (*node)->data) {
        insertNode(data, &((*node)->left));
    } else {
        insertNode(data, &((*node)->right));
    }
}

// Function to generate random data values
void generateRandomData(int num) {
    srand(time(NULL));
    for (int i = 0; i < num; i++) {
        insertNode(rand() % 100, &root);
    }
    printf("Random data generated.\\n");
}

// Function to display all nodes in in-order
void displayInOrder(struct TreeNode* node) {
    if (node == NULL) {
        return;
    }

    displayInOrder(node->left);
    printf("%d ", node->data);
    displayInOrder(node->right);
}

// Function to display the binary tree and its subtrees
void displayTree(struct TreeNode* node) {
    if (node == NULL) {
        return;
    }

    printf("Root: %d\\n", node->data);
    printf("Left subtree: ");
    displayInOrder(node->left);
    printf("\\nRight subtree: ");
    displayInOrder(node->right);
    printf("\\n");
}

// Function to free the memory of the binary tree
void freeTree(struct TreeNode* node) {
    if (node == NULL) {
        return;
    }
    freeTree(node->left);
    freeTree(node->right);
    free(node);
}

int main() {
    int choice;
    while (1) {
        printf("Binary Tree Menu:\\n");
        printf("1. Input 15 values manually\\n");
        printf("2. Generate 15 random values\\n");
        printf("3. Display input values\\n");
        printf("4. Display root, left subtree, and right subtree\\n");
        printf("0. Exit\\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1: {
                printf("Please enter 15 values one by one:\\n");
                for (int i = 0; i < 15; i++) {
                    int data;
                    printf("Enter the value of data element %d: ", i + 1);
                    scanf("%d", &data);
                    insertNode(data, &root);
                }
                printf("Data input complete.\\n");
                break;
            }
            case 2:
                generateRandomData(15);
                break;
            case 3:
                printf("Input values: ");
                displayInOrder(root);
                printf("\\n");
                break;
            case 4:
                if (root != NULL) {
                    displayTree(root);
                } else {
                    printf("No tree data\\n");
                }
                break;
            case 0:
                freeTree(root);
                exit(0);
                break;
            default:
                printf("Wrong Choice.\\n");
                break;
        }
    }
    return 0;
}