2011-04-06 7 views
3

바이너리 검색 트리에 대한 두 가지 질문이 있습니다. 하나는 작성중인 코드에 관한 것이고 다른 하나는 이론에 관한 것입니다. 우선, 아래에 쓴 코드는 BST가 실제로 비어있는 경우를 표시하려고 할 때를 제외하고는 정상적으로 작동합니다. 그것은 내가 오류 메시지를 출력하고 싶을 때 나에게 세분화 오류를 준다. 어떤 시점에서 포인터가 섞여서 오류가 발생하는 것 같습니다. 여기 내 코드는 다음과 같습니다.바이너리 검색 트리에 대한 두 가지 질문

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

struct Node { 
char *word; 
struct Node *left; 
struct Node *right; 
}; 

/* Function that creates a new node as a leaf; that is, its  */ 
/* left and right children are NULL.    */ 
/* Require: node -> word != NULL     */ 
struct Node * createNode (char *word) { 
struct Node *item = malloc(sizeof(struct Node)); 
item -> word = word; 
item -> left = NULL; 
item -> right = NULL; 
return item; 
} 

/* Recursive function that inserts a node into proper position by */ 
/* searching through tree.     */ 
struct Node * insertNode (struct Node *root, char *word) { 
// If tree is empty, node becomes root 
if(root == NULL) 
    return createNode(word); 
else { 

    if(strcmp(word, root -> word) < 0) { 
     root -> left = insertNode(root -> left, word); 
     return root; 
    } else if(strcmp(word, root -> word) > 0) { 
     root -> right = insertNode(root -> right, word); 
     return root; 
    } else if(strcmp(word, root -> word) == 0) 
     printf("Word is already present in the tree."); 
} 
} 

/* Function to display Binary Search Tree via inorder traversal. */ 
/* -- prints entire left subtree, then root, then right subtree */ 
void display (struct Node *root) { 
if(root -> word == NULL) 
    printf("Tree is empty."); 
if(root -> left != NULL) 
    display(root -> left); 
printf("%s\n", root -> word); 
if(root -> right != NULL) 
    display(root -> right); 
} 

void main() { 
struct Node root; 
struct Node *rootP = &root; 
root = createNode(" 
} 

두 번째 질문은 이진 트리를 채우는 것입니다. 물론 알파벳순으로 된 작은 사전을 사용하고 싶습니다. "aardvark"로 시작하는 이진 트리에이 단어를 입력하면 모든 후속 단어가 첫 번째 알파벳순으로 올 수 있기 때문에 트리가 믿을 수 없을 정도로 비뚤어지지 않으므로 항상 올바른 어린이일까요? 믿을 수 없을 정도로 균형 잡힌 나무로 마무리 할까 봐 걱정됩니다! 내가 그것을 채울 때 나무를 뒤적 거리기 위해 사용할 수있는 방법이 있습니까?

시간을내어 읽어 주셔서 감사합니다.

답변

3

display 함수에서 먼저 root -> word == null을 테스트하기 전에 root == null이 있는지 테스트해야합니다. 그러면 seg 오류가 해결됩니다.

이론 질문과 관련하여 대답은 그렇다. 나무는 믿을 수 없을 정도로 비뚤어 질 것이다. 그게 balanced binary trees입니다.

+0

양해 해 주셔서 감사합니다. 나는 지금 그것에 관해 읽을 예정이다 :) –

1
if(root -> word == NULL) 
    printf("Tree is empty."); 

여기에 문제가 있습니다. 루트 자체가 null이면 어떻게됩니까? 그것을 역 참조하기 전에 포인터를 다시 확인하십시오.

예, 정렬 된 순서로 (또는 상대적으로 정렬 된) 항목을 삽입하면 비뚤어진 트리가 생깁니다. 균형 이진 트리의 노드에 대한 회전 알고리즘을 살펴보십시오.

+0

도깨비, 다시 박자 – octal9

+0

많은 감사! 문제가 해결되었습니다. 균형 잡힌 바이너리 트리와 순환 알고리즘에 대해 읽으려고합니다. –

0

두 번째 질문에 대해서는 다른 사람들이 이미 이진 트리 균형 조정을 살펴 보았습니다. 그러나 대안으로 입력 내용이 이미 정렬 된 것으로 알려진 경우 이진 검색 대신 선형 배열을 사용하여 이진 트리가 아닌 관심있는 항목을 찾는 것이 더 적절합니다. 정렬 된 배열의 이진 검색은 균형 이진 트리의 검색과 동일한 시간 복잡성을 갖습니다.

+0

나는 그걸 생각하지 않았다. 배열에 하나의 요소를 추가하고 싶지만 순서가 맞지 않으면 시간 효율성이 여전히 동일할까요? –

+0

@Brittany : 아니오, 바이너리 검색이 작동하려면 목록을 정렬 된 순서로 유지해야합니다. – caf