바이너리 트리 구현 : insert_tree () 관련 문제

Norhther

나는 C ++을 한 후에 약간의 C를 배우기 시작했기 때문에 bintree 구현을 사용하고 있습니다.

암호:

struct Node {
    int value = -1;
    struct Node* left = NULL;
    struct Node* right = NULL;
};

void insert_tree(int value, Node* root) {
    if (root == NULL) {
        root = (struct Node*) malloc(sizeof(Node));
        root->value = value;
        printf("%d\n", root->value);
        root->left = NULL;
        root->right = NULL;
    }
    else {
        if (root->value >= value) {
            insert_tree(value, root->left);
        }
        else {
            insert_tree(value, root->right);
        }
    }
}

void printTree(Node* root) {
    if (root != NULL) {
        printf("%i\n", root->value);
        printTree(root->left);
        printTree(root->right);
    }
}

int main() {
    Node* root = NULL;
    insert_tree(30, root);
    printTree(root);
}

여기서는 insert_tree가 어떻게 malloc을 수행하고 메모리를 올바르게 할당하는지 볼 수 있으므로 내부 insert_tree30을 출력 하지만 printTree()트리에 노드가 없습니다. 노드의 왼쪽 포인터를 전달하고 있기 때문에 이유를 모르겠고 insert_tree.

insert_tree()여기서 문제는 무엇입니까 ?

Vlad / 모스크바

우선이 구조 선언

struct Node {
    int value = -1;
    struct Node* left = NULL;
    struct Node* right = NULL;
};

C에서는 유효하지 않습니다. 이니셜 라이저를 지정할 수 없습니다.

따라서 선언은 다음과 같습니다.

struct Node {
    int value;
    struct Node* left;
    struct Node* right;
};

이 함수 insert_tree는 값으로 루트 노드에 대한 포인터를 가져옵니다. 즉, 함수는 원래 포인터의 복사본을 처리하므로 함수 내에서 원래 포인터의 복사본을 변경해도 원래 포인터의 값에는 영향을주지 않습니다.

포인터를 참조로 전달해야합니다. C에서 참조로 전달은 포인터를 통해 간접적으로 객체를 전달하는 것을 의미합니다. 메모리 할당이 실패 할 수 있다는 점을 고려하십시오. 함수가 새 노드 삽입이 성공했는지 여부를보고하는 것이 바람직합니다.

또한 첫 번째 매개 변수를 루트 노드에 대한 포인터에 대한 포인터로 만들고 두 번째 매개 변수를 삽입해야하는 값으로 만드는 것이 더 유능 할 것입니다.

어쨌든이 함수 선언

void insert_tree(int value, Node* root) {
                            ^^^^^^^^^^

C의 C ++와 반대로 키워드 구조체를 다음과 같이 지정해야하므로 잘못된 C 함수 선언입니다.

void insert_tree(int value, struct Node* root) {
                            ^^^^^^^^^^^^^^^^^ 

재귀 함수 insert_tree는 다음과 같이 정의 할 수 있습니다.

int insert_tree( struct Node **root, int value ) 
{
    if ( *root == NULL ) 
    {
        *root = (struct Node*) malloc( sizeof( struct Node ) );
        if ( *root != NULL )
        {
            ( *root )->value = value;
            ( *root )->left  = NULL;
            ( *root )->right = NULL;
        }

        return *root != NULL;
    }
    else 
    {
        if ( value < ( *root )->value ) 
        {
            return insert_tree( &( *root )->left, value );
        }
        else 
        {
            return insert_tree( &( *root )->right, value );
        }
    }
}

함수는 다음과 같이 호출 할 수 있습니다.

int main( void ) 
{
    struct Node *root = NULL;
    insert_tree( &root, 30 );
    printTree( root );
}

또한 함수 printTree가 트리를 변경하지 않으므로 해당 매개 변수에 한정자가 있어야합니다 const.

void printTree( const struct Node* root ) {
    if (root != NULL) {
        printf("%i\n", root->value);
        printTree(root->left);
        printTree(root->right);
    }
}

여기에 데모 C 프로그램이 있습니다.

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

struct Node 
{
    int value;
    struct Node *left;
    struct Node *right;
};

int insert_tree( struct Node **root, int value ) 
{
    if ( *root == NULL ) 
    {
        *root = (struct Node*) malloc( sizeof( struct Node ) );
        if ( *root != NULL )
        {
            ( *root )->value = value;
            ( *root )->left  = NULL;
            ( *root )->right = NULL;
        }

        return *root != NULL;
    }
    else 
    {
        if ( value < ( *root )->value ) 
        {
            return insert_tree( &( *root )->left, value );
        }
        else 
        {
            return insert_tree( &( *root )->right, value );
        }
    }
}

void printTree( const struct Node* root ) {
    if (root != NULL) {
        printf("%i\n", root->value);
        printTree(root->left);
        printTree(root->right);
    }
}

int main(void) 
{
    struct Node *root = NULL;

    const int N = 10;

    srand( ( unsigned int )time( NULL ) );

    for ( int i = 0; i < N; i++ )
    {
        insert_tree( &root, rand() % N );
    }

    printTree( root );

    return 0;
}

출력은 다음과 같을 수 있습니다.

1
0
9
4
3
7
5
6
5
8

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C에서 바이너리 트리 minheap 구현과 관련된 다양한 문제

분류에서Dev

mysql 쿼리 관련 문제

분류에서Dev

쿼리 PostgreSQL 관련 문제

분류에서Dev

이벤트 리스너에 대한 디 바운스를 어떻게 구현합니까? 보관 이벤트 문제

분류에서Dev

바이너리 트리 구현 C ++

분류에서Dev

바이너리 서치 알고리즘을 구현하는 문제

분류에서Dev

종속성 구문 분석과 관련된 Spacy NLP 라이브러리 문제

분류에서Dev

이 바이너리 트리 구현에서 가능한 문제는 무엇입니까?

분류에서Dev

반응 형 디자인 및 .click () 이벤트 리스너 관련 문제

분류에서Dev

이 벡터 구현의 유지 관리 문제

분류에서Dev

동적 메모리 (_CrtIsValidHeapPointer) 관련 문제

분류에서Dev

시간 쿼리 관련 BigQuery 문제

분류에서Dev

Firebase 쿼리 관련 문제-Swift

분류에서Dev

바이너리 트리 인쇄 문제

분류에서Dev

마우스 이벤트 관련 문제

분류에서Dev

Hibernate 튜토리얼 용 Maven 프로젝트 관련 문제

분류에서Dev

트리거 만들기와 관련된 JavaScript / jQuery 문제

분류에서Dev

SQL Server 기능 및 트리거 관련 문제

분류에서Dev

AFTER UPDATE 트리거의 UPDATE 관련 성능 문제

분류에서Dev

Angular를 사용한 이벤트 구독 관련 잠재적 문제

분류에서Dev

Wierd Angular Binding 문제-관련없는 구성 요소 업데이트

분류에서Dev

GreenDao로 이벤트 리스너 / 관찰자 패턴 구현

분류에서Dev

바이너리 검색 알고리즘 구현에 어떤 문제가 있습니까?

분류에서Dev

문제가 자바의 연결리스트를 구현

분류에서Dev

미리 만들어진 자바 스크립트 구현 문제

분류에서Dev

이 SQL 트리거 코드에 컴파일 관련 문제가 있습니까?

분류에서Dev

이 SQL 트리거 코드에 컴파일 관련 문제가 있습니까?

분류에서Dev

바이너리 트리 노드 제거 자바 문제

분류에서Dev

MongoDB 스토리지 관련 문제 (9001이 이미 사용 중)

Related 관련 기사

  1. 1

    C에서 바이너리 트리 minheap 구현과 관련된 다양한 문제

  2. 2

    mysql 쿼리 관련 문제

  3. 3

    쿼리 PostgreSQL 관련 문제

  4. 4

    이벤트 리스너에 대한 디 바운스를 어떻게 구현합니까? 보관 이벤트 문제

  5. 5

    바이너리 트리 구현 C ++

  6. 6

    바이너리 서치 알고리즘을 구현하는 문제

  7. 7

    종속성 구문 분석과 관련된 Spacy NLP 라이브러리 문제

  8. 8

    이 바이너리 트리 구현에서 가능한 문제는 무엇입니까?

  9. 9

    반응 형 디자인 및 .click () 이벤트 리스너 관련 문제

  10. 10

    이 벡터 구현의 유지 관리 문제

  11. 11

    동적 메모리 (_CrtIsValidHeapPointer) 관련 문제

  12. 12

    시간 쿼리 관련 BigQuery 문제

  13. 13

    Firebase 쿼리 관련 문제-Swift

  14. 14

    바이너리 트리 인쇄 문제

  15. 15

    마우스 이벤트 관련 문제

  16. 16

    Hibernate 튜토리얼 용 Maven 프로젝트 관련 문제

  17. 17

    트리거 만들기와 관련된 JavaScript / jQuery 문제

  18. 18

    SQL Server 기능 및 트리거 관련 문제

  19. 19

    AFTER UPDATE 트리거의 UPDATE 관련 성능 문제

  20. 20

    Angular를 사용한 이벤트 구독 관련 잠재적 문제

  21. 21

    Wierd Angular Binding 문제-관련없는 구성 요소 업데이트

  22. 22

    GreenDao로 이벤트 리스너 / 관찰자 패턴 구현

  23. 23

    바이너리 검색 알고리즘 구현에 어떤 문제가 있습니까?

  24. 24

    문제가 자바의 연결리스트를 구현

  25. 25

    미리 만들어진 자바 스크립트 구현 문제

  26. 26

    이 SQL 트리거 코드에 컴파일 관련 문제가 있습니까?

  27. 27

    이 SQL 트리거 코드에 컴파일 관련 문제가 있습니까?

  28. 28

    바이너리 트리 노드 제거 자바 문제

  29. 29

    MongoDB 스토리지 관련 문제 (9001이 이미 사용 중)

뜨겁다태그

보관