2016-07-23 1 views
0

저는 천천히 프로그램을 작성하고 스스로 이진 트리를 가르치려고했습니다. 이 프로그램은 트리를 사용하여 데이터를 저장하는 전화 번호부입니다. 현재 findOrInsert 함수가 작동하지 않습니다. 원래는 데이터를 열린 영역에 삽입했습니다. 이제 그 데이터를 추가하기 전에 이미 존재하는지 확인하고 싶습니다. 그런 다음 사용자에게 이미 동일한 데이터가 있음을 알리는 기능을 반환합니다. 나는 몇 가지를 시도했지만 행운이 없다. 나는 처음부터 그것을 재 작성하려고 할 수도 있습니다. 그 전에 나는 어떤 도움을받을 수 있는지 알고 싶었습니다.바이너리 트리 : 동일한 값 찾기

이것은 현재 가지고있는 것입니다.

struct treeNode * findOrInsert(struct treeNode *p, Entry e) { 

    if (p == NULL) { 
     p = createNode(NULL, NULL, e); 
    } 
    else if (strcmp(e.fName, p->data.fName) < 0) { 
     p->left = findOrInsert(p->left, e); 
    } 
    else if (strcmp(e.fName, p->data.fName) > 0) { 
     p->right = findOrInsert(p->right, e); 
    } 
    else { 
     if (strcmp(e.lName, p->data.lName) < 0) { 
      p->left = findOrInsert(p->left, e); 
     } 
     else if (strcmp(e.lName, p->data.lName) > 0) { 
      p->right = findOrInsert(p->right, e); 
     } 
     else { 
      return p; 
     } 
    } 
    return p; 
} 

struct treeNode * createNode(struct treeNode *q, struct treeNode *r, Entry e) { 
    struct treeNode * newNode; 
    newNode = (struct treeNode*)(malloc(sizeof(struct treeNode))); 
    newNode->data = e; 
    newNode->left = q; 
    newNode->right = r; 
    return newNode; 
} 

도움을 주시면 감사하겠습니다.

답변

0

왜 그냥 단순히 pe의 성과 이름이 같은지 여부를 확인하기 위해

if (p == NULL) { 
    p = createNode(NULL, NULL, e); 
} 

후 다른 검사를 추가? (물론 트리의 각 항목에는 이름과 성이 있다고 가정). 나는이 문 다음에 널 객체를 e과 비교하고 싶지 않기 때문에 말합니다. 따라서 p이 존재한다는 것을 확인한 후에 e의 성과 이름이 p의 성과 이름과 일치하는지 확인해야합니다. 그렇다면 e이 트리 또는 이미 존재하고 재귀를 끝내기 위해 p을 반환합니다 (뭔가를 반환하는 대신 예외를 throw하는 것이지만 프로그램 실행을 중단시킬 수 있습니다). 그것은 다음과 같이 보일 것입니다.

else if (strcmp(e.fName, p->data.fName) == 0 && strcmp(e.lName, p->data.lName) == 0) { 
    printf("Entry already exists in tree"); 
    return p; 
} 
+1

정직하게 생각했습니다. 뭔가 다른 것을해야합니다. 지금은 효과가있는 것 같습니다. 고맙습니다! – arthos455