2013-07-05 2 views
0

필자는 필자의 경우에는 작동하지 않지만 새로운 노드를 반복적으로 추가하는 데 필요한 코드를 찾았습니다. 에서반복적으로 새 노드를 이진 트리에 추가, 루트 덮어 쓰기

// bal=left jobb=right 
void bkf::beszur(int k) { 
    if(root != NULL) 
     while (true) { 
      if (k < root->data) { 
       if (root->bal == NULL) { 
        root->bal = new node; 
        root->bal->data = k; 
        root->bal->bal = NULL; 
        root->bal->jobb = NULL; 
        break; 
       } 
       else 
        root = root->bal; // overwrites root 
      } 
      else 
       if (root->jobb == NULL) { 
        root->jobb = new node; 
        root->jobb->data = k; 
        root->jobb->bal = NULL; 
        root->jobb->jobb = NULL; 
        break; 
       } else 
        root = root->jobb; // overwrites root 
     } 
    else { 
     root = new node; 
     root->data = k; 
     root->bal = NULL; 
     root->jobb = NULL; 
    } 
} 

"루트 = 루트 레벨> BAL"이 데이터를 받아 왼쪽 너무 루트 레벨> BAL 오른쪽 노드 너무 있도록 루트는 덮어 쓰기됩니다. 또한 "노드 * p"를 만들고 루트를 할당하려고 시도했지만 p가 가리키는 곳이 아닌 p 자체에 메모리를 할당합니다. 다음은 선언입니다.

struct node { 
    int data; 
    node *bal; 
    node *jobb; 
}; 

class bkf { 
    node *root; 
    // ... 

어떻게 제대로 수행됩니까?

답변

0

루트는 클래스 수준 범위 변수이기 때문에. root의 로컬 복사본을 만듭니다. root_local을 가정 해 봅시다.

root_local = root.

그런 다음이 기능에서 사용을 시작하십시오.

root = root-> bal. 루트는 클래스 수준에서 변경됩니다.

+0

노드를 수행 중 * root_local = root가 작동했습니다. 감사. 첫 번째 노드를 만들 때 할당 후 root = root_local을 수행해야했지만. – vEx

0

어쩌면 요점은 트리 내부에서 트래버스/삽입하기 전에 루트 노드를 저장하지 않는다는 것입니다. 따라서 root는 함수를 호출 한 후 임의의 노드입니다.

첫 번째 함수 호출 전에 항상 루트를 저장하여 항상 진입 점이 다시 시작되도록해야합니다.

관련 문제