2017-09-28 1 views
0

선불 순회 (ROOT, LEFT, RIGHT)를 사용하여 특정 노드의 주소를 가져온 다음이 항목을 사용하여 이진 검색 트리를 만들고 싶습니다.포인터가 재귀 함수 종료 후 주소를 변경합니다.

재귀 함수는 작동하지만 끝날 때 노드에 대한 포인터가 NULL로 다시 변경됩니다.

void rlr(Node * x,Node * z) 
{ 
    if (x != NULL) 
    { 
     if (a condition) 
     { 
      z = x; 
     } 
     rlr(x->get_left(),z); 
     rlr(x->get_right(),z); 
    } 
} 

void main() 
{ 
.... 
Node * z = NULL; 
rlr(root,z); 
while(z!=NULL) 
.... 
} 

더 정확하게 RLR 함수 조건이 노드에 해당 Z 포인트이며 그 노드 가리켜 야하지만,이 기능을 종료 할 때, Z 포인트 다시 NULL 대신 특정 노드를 가리키는 경우.

+0

의 함수 호출에 assignement &zNode** z 대신 함수 매개 변수에 Node* z, *z 대신 z를보고하십시오. 어느쪽에 지정 하시겠습니까? –

+2

매개 변수는 C++에서 값으로 전달됩니다. –

+2

전달 된 매개 변수를 정말로 수정하려면 사용 가능한 더 좋은 옵션이 있지만 참조로 전달해야합니다. 예 :이 경우 원하는 포인터를 반환 할 수 있습니다 (또한 'NULL'과 원시 포인터보다 스마트 포인터를 선호) – UnholySheep

답변

1

주 기능의 z 값은 수정되지 않습니다. 간접 지정 기능을 추가하여 작동하게하십시오.

void rlr(Node * x,Node ** z) 
{ 
    if (x != NULL) 
    { 
     if (a condition) 
     { 
      *z = x; 
     } 
     rlr(x->get_left(),z); 
     rlr(x->get_right(),z); 
    } 
} 

void main() 
{ 
.... 
Node * z = NULL; 
rlr(root,&z); 
while(z!=NULL) 
.... 
} 

그렇게해야합니다. 당신은 Z라는 두 개의 서로 다른 변수를 대신 z

+0

왜이 포인터를 포인터로 사용 하시겠습니까? 또한'void main()'이 비표준 임 – UnholySheep

+0

나는 메모리로 작업 중이며 또 다른 수준의 간접 지정이 필요 없다고 생각했다. 이전에 매우 가까웠지만 충분하지는 않았다. 고맙다. 나는 어떻게 작업 할 것인지를 알고 있다고 생각했다. 포인터하지만 그것은 내가 되풀이해야한다고 보인다. –

+0

포인터를 가리키는 포인터가 작동하지만 그 방법은 포인터의 포인터입니다. C++에서는 포인터 대신 참조 포인터를 사용하는 것을 선호합니다 : void rlr (Node * x, Node * & z) {... z = x; ...} int main() {... rlr (root, z); ...}' –

관련 문제