Узел равен нулю, хотя он имеет значение? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь создать двоичное дерево поиска на основе массива целых чисел.

Я создал функцию BST, которая принимает массив и его размер в качестве параметра. Теперь я вызываю другую функцию makeBST для каждого элемента массива, который принимает узел root и это значение. Он создает другой узел и присоединяет его к узлу root в зависимости от значения.

Но функция makeBST не рекурсивна сама по себе и не выполняет условие NULL для каждого значения массива, даже если узел root не равен нулю

#include<iostream>
#include<cmath>

using namespace std;

class Node {

    public:
    int data;
    Node *left;
    Node *right;
};

Node *newNode(int x){

    Node *node = new Node();
    node->data = x;
    node->left=NULL;
    node->right = NULL;
    return node;
};


void makeBST(Node *node, int x){

    if(node==NULL){
        // keep getting executed even though root node has a value.
        // here must be error.

        cout << " NULL condition " << endl;
        node = newNode(x);
        return;
    };
    if((node->data) > x){
        cout << "also working" << endl;
        makeBST(node->left,x);
    }else if((node->data) < x){
        makeBST(node->right,x);
    };
};

Node *BST(int arr[], int n){

    Node *root = newNode(arr[0]);
    for(int i=1; i<=n-1; i++){
        cout << "loop" << i << endl;
        makeBST(root,arr[i]);
    };
    return root;
};

int main(){

    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int n=10;
    Node *root = BST(arr,n);

    return 0;
};

Я знаю, что это не лучший способ создания бинарного дерева поиска. Но я новичок, и это то, что я могу придумать.

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 22 января 2020

в настоящее время вы меняете локальное значение (* node) в функции, не влияя на переменную node, передаваемую ей. Вы должны прочитать о передаче указателей как значения, а не как ссылки.

Если вы хотите изменить node, вам нужно передать его как ссылку:

void makeBST(Node **node, int x) {

    if(*node==NULL){
        cout << " NULL condition " << endl;
        node = &newNode(x);
        return;
    };
    if((*node->data) > x){
        cout << "also working" << endl;
        makeBST(&(*node->left),x);
    }else if((*node->data) < x){
        makeBST(&(*node->right),x);
    };
};

Убедитесь, что вы передали адрес узла при вызове makeBST.

...