Сравнение двоичного дерева и рекурсивная вставка - PullRequest
0 голосов
/ 11 апреля 2020

У меня проблема со сравнением root и значения, которое будет вставлено.

Я пытаюсь прочитать имена из txt-файла и построить двоичное дерево (сравнение по алфавиту) .

Проблема, с которой я сталкиваюсь, заключается в том, что root -> name и value-> name становятся одинаковыми, что не должно происходить.

Например,

, если имена в текстовом файле:

alex
brian
chris

сначала, поскольку rootNode имеет значение NULL, функция вставки должна изменить свое имя root на alex. Затем следует сравнить новое имя (brian) с именем корневого узла (alex). Затем установите новый узел (brian) в rightNode корневого узла (alex). но, похоже, этого не происходит.

Что я делаю не так? Как бы я подошел к этой проблеме?

Спасибо!

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

struct binaryTree{
    char* name;
    struct binaryTree* leftNode;
    struct binaryTree* rightNode;
};


struct binaryTree* insert(struct binaryTree* root, struct binaryTree* value);
struct binaryTree* init(char* val);
int main() {
    struct binaryTree* rootNode = NULL;
    char name[100];
    int numWords;
    int searchNum;
    int deleteNum;

    struct binaryTree* tempNode;

    FILE *fPtr;
    if ((fPtr = fopen("in.txt", "r")) == NULL){
        printf("Error. No File Found");
        exit(1);
    }

    for(int i = 0; i < 3; i ++){
        fscanf(fPtr, "%d", &numWords);
        fscanf(fPtr, "%d", &searchNum);
        fscanf(fPtr, "%d", &deleteNum);
    }
    printf("%d %d %d", numWords, searchNum, deleteNum);

    for (int i = 0; i <numWords; i ++){
        fscanf(fPtr, "%s", name);
        tempNode = init(name);
        rootNode = insert(rootNode, tempNode);

    }
    return 0;
}

struct binaryTree* insert(struct binaryTree* root, struct binaryTree* value){
    if (root == NULL){
        printf("value = %s\n",value->name);
        return value;
    }
    else{
        if(strcmp(root->name, value->name)>0){
            if(root->rightNode != NULL){
                printf("inserting right");
                root->rightNode = insert(root->rightNode,value);
            }
            else{
                root->rightNode = value;
            }
        }
        else if(strcmp(root->name, value->name)<0){
            printf("inserting left\n");
            if(root->leftNode != NULL){
                root->leftNode = insert(root->leftNode,value);
            }
            else{
                root->leftNode = value;
            }
        }
        else{
            printf("the names are same");
        }
        return root;
    }
}

struct binaryTree* init(char* val){
    struct binaryTree* temp;
    temp = (struct binaryTree*)malloc(sizeof(struct binaryTree));
    temp->name = val;
    temp->leftNode = NULL;
    temp->rightNode = NULL;
    return temp;
}
...