ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 노드에 값이 있는데도 null입니까?
    카테고리 없음 2020. 8. 13. 21:43

    질문

    정수 배열을 기반으로 이진 검색 트리를 만들려고합니다.

    배열과 크기를 매개 변수로 취하는 함수 BST를 만들었습니다. 이제 루트 노드와 해당 값을 사용하는 배열의 모든 항목에서 다른 함수 makeBST를 호출합니다. 다른 노드를 생성하고 값에 따라 루트 노드에 연결합니다.

    하지만 makeBST 함수는 루트 노드가 null이 아니더라도 자체적으로 반복되지 않고 배열의 모든 값에 대해 NULL 조건을 실행합니다.

    #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

    현재 함수에 전달되는 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 를 호출 할 때 노드의 주소를 전달해야합니다.



     

     

     

     

    출처 : https://stackoverflow.com/questions/59857107/node-is-null-even-though-it-has-a-value

    댓글

Designed by Tistory.