2017-12-31 34 views
-1

안녕하세요 저는 노드를 바이너리 검색 트리에 삽입하는 데 deference를 사용하려고했습니다. 하지만 지금은 삽입 기능에 갇혀 있다고 생각합니다. insert 함수를 호출 할 때 실수를 저질렀다고 생각합니다. 그래서 누구든지 내 코드에 어떤 문제가 있는지 말해 줄 수 있습니다. 감사합니다.dereference를 사용하여 C++ 바이너리 검색 트리

struct BstNode { 
    int data; 
    BstNode *left; 
    BstNode *right; 
}; 


BstNode *GetNewNode(int); 

void Insert(BstNode **, int); 

void Insert(BstNode **root, int data) 
{ 
    if(*root == NULL){ 
     *root = GetNewNode(data); 
    } 
    else if(data <= root){ 
     Insert(*(root -> left), data); 
    } 
    else { 
     Insert(*(root -> right), data); 
} 

BstNode *GetNewNode(int data) 
{ 
    BstNode *newNode = new BstNode(); 
    newNode->data = data; 
    newNode->left = newNode->right = NULL; 
    return newNode; 
} 

int main() 
{ 
    BstNode *root = NULL; 

    Insert(&root,15); 
    Insert(&root,10); 
    Insert(&root,20); 

    return 0; 
} 
+0

의미가 무엇인지 자세히 설명해 주시겠습니까? "붙어있어?" 컴파일러 오류? 프로그램이 실행되지만 멈추지 않습니까? 코드를 작성하는 방법을 알아낼 수 없습니까? – 1201ProgramAlarm

+0

@Shawn W W이 조건은 else if (data <= root) {는 의미가 없습니다. –

답변

0

은 무엇을 의미하는 것은 다음과 같은

void Insert(BstNode **root, int data) 
{ 
    if (not *root) 
    { 
     *root = GetNewNode(data); 
    } 
    else if (data < (*root)->data) 
    { 
     Insert(&(*root)->left, data); 
    } 
    else 
    { 
     Insert(&(*root)->right, data); 
    } 
} 

이 기능의 구현 조건의 구문이 함수에 조건의 구문을 비교하고 모든 분명있을 것입니다.

예를 들어이 경우 문은 적어도 두 가지 오류

else if(data <= root){ 
     ^^^^^^^^^^^^ 
     Insert(*(root -> left), data); 
       ^^^^^^^^^^^^^^^ 

을 가지고 있으며, 컴파일러는 해당 진단 메시지를 발행합니다.

+0

고맙습니다. 작동합니다. 하지만 & (* root) -> 여기에 어떤 의미가 있는지 궁금합니다. 포인터의 주소를 가져 가야합니까? 나는 혼란 스럽다. 그리고 왜 여기에 Insert 함수의 루트 앞에 두 개가 필요합니다. 도와 줘서 고마워. –

+0

@ShawnWW 포인터를 원래 노드로 변경하려면 포인터를 포인터로 사용하여 참조로 전달해야합니다. 그렇지 않으면 함수는 원래 노드의 사본을 처리합니다. –

+0

고마워, 그럼 & (* 루트) -> 왼쪽 의미가 무엇인지 설명 할 수 있겠 니? –

-1

이 코드에서 몇 가지 오류 오류가 당신은뿐만 아니라

먼저 당신이 확인해야 삽입 기능 두 번째의 노드를 선언해야 BST를 모르는 표시되어 있으면 이하의 데이터보다 더 큰 루트에있는 데이터가 같으면 삽입 할 수 있습니다. 세 번째 노드를 삽입하면 u 노드의 루트 또는 오른쪽 포인터를 노드에 연결해야합니다.