Как я могу вставить новые узлы в двоичное дерево поиска? - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь вставить в BST N раз, и мне нужно попросить пользователя ввести данные внутри функции insert. Это мой код. Я попытался распечатать дерево, используя метод предварительного заказа, но он печатает только последний ввод. Я должен использовать ID в качестве ключа и распечатать с помощью PreOrder все данные Salary и ID.


    #include <stdio.h>
    #include <stdlib.h>
    struct Node{

        int EmployeeID;
        float Salary;
        struct Node* left;
        struct Node* right;
    };

    struct Node* insert(struct Node* root,int ID, float Salary){



        printf("Enter Employee ID: ");
        scanf("%d", &ID);

        printf("Enter Employee Salary: ");
        scanf("%f", &Salary);

        if(root == NULL){

            root = (struct Node*)malloc(sizeof(struct Node));
            root->EmployeeID = ID;
            root->Salary = Salary;
            root->left=root->right= NULL;
        }

        else if(ID < root->EmployeeID)
            root->left = insert(root->left, ID, Salary);
        else
            root->right = insert(root->right, ID, Salary);

    return root;

    };

    void PrePrint(struct Node* root){

        if(root == NULL)
            return;

        printf("%d   %.2f", root->EmployeeID, root->Salary);
        PrePrint(root->left);
        PrePrint(root->right);

        return;
    }
    int main()
    {
        int N, i;
        struct Node* root;
        int ID;
        int Sal;
        root = NULL;

        printf("How many Employee you would like to enter? \n");
        scanf("%d", &N);

        for(i=0; i<N; i++){

            root = insert(root, ID, Sal);
            printf("\n");

        }
            PrePrint(root);
        }

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Удалите первый оператор root = NULL; в вашей функции вставки.

Что касается функции вставки, вы можете изменить ее на:

struct Node* insert(struct Node* root, int ID, float Salary){
        printf("Enter Employee ID: ");
        scanf("%d", &ID);

        printf("Enter Employee Salary: ");
        scanf("%f", &Salary);

        struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
        newNode->EmployeeID = ID;
        newNode->Salary = Salary;
        newNode->left = NULL;
        newNode->right = NULL;

        struct Node* cp_of_root = root;
        if(root==NULL)
             return newNode;
        struct Node* parent = NULL;
        while(root!=NULL){
             parent = root;
             if (newNode->val > root->val)
                  root = root->right;
             else
                  root = root->left;
        }
        if(newNode->val > parent->val)
              parent->right = newNode;
        else
              parent->left = newNode;
        return cp_of_root;

}

Надеюсь, этот код очищает Разве ты сомневаешься.

0 голосов
/ 27 мая 2020

, чтобы сохранить scanf в функции вставки, вы хотите сделать флаг, чтобы знать, инициализируете ли вы переменные (идентификатор и зарплату) впервые или у вас уже есть значения и вы не хотите снова сканировать.

#include <stdio.h>
#include <stdlib.h>
struct Node{

    int EmployeeID;
    float Salary;
    struct Node* left;
    struct Node* right;
};

struct Node* insert(struct Node* root,int ID, float Salary){
    if(ID==-1 && Salary==-1)
    {
        printf("Enter Employee ID: ");
        scanf("%d", &ID);

        printf("Enter Employee Salary: ");
        scanf("%f", &Salary);

    }
    if(root == NULL){

        root = (struct Node*)malloc(sizeof(struct Node));
        root->EmployeeID = ID;
        root->Salary = Salary;
        root->left=NULL;
        root->right= NULL;
    }

    else if(ID < root->EmployeeID)
        root->left = insert(root->left, ID, Salary);
    else
        root->right = insert(root->right, ID, Salary);

return root;

};

void PrePrint(struct Node* root){

    if(root == NULL)
        return;

    printf("%d   %.2f\n", root->EmployeeID, root->Salary);
    PrePrint(root->left);
    PrePrint(root->right);

return;
}
int main()
{
    int N, i;
    struct Node* root;
    int ID;
    float Salary;
    root = NULL;

    printf("How many Employee you would like to enter? \n");
    scanf("%d", &N);

    for(i=0; i<N; i++){
        root = insert(root, ID=-1, Salary=-1);
        printf("\n");

    }
        PrePrint(root);
    }
...