我一直在試圖讓這個BST在過去的幾天工作,我陷入了搜索功能。邏輯似乎是正確的(除非我錯過了非常重要的細節),但代碼仍然有問題。難道是因爲我在處理字符串?無論如何,這裏是一些代碼:在二進制搜索樹中的搜索功能會導致段錯誤
編輯:我已經指出了某個地方似乎出錯了。事實證明,我的根始終爲空。我放置了一個printf來測試NULL是否爲真,並且它總是打印爲真。我在這個問題的底部添加了我的樹初始化。
的(更新)搜索功能:
//Thank you, M Oehm
node* search(node * tree, char *key)
{
/* char *key is user input */
int cmp;
if(tree == NULL) {
return NULL;
}
cmp = strcmp(key, tree->key);
if(cmp < 0) return search(tree->left, key);
if(cmp > 0) return search(tree->right, key);
return tree;
}
實現在主要功能:
printf("Enter a string to search the tree with: ");
fgets(findNode, MAX_WORD, stdin);
findString = malloc(sizeof(char)*strlen(findNode)+1);
strcpy(findString,findNode);
printf("findString: %s\n", findString);
searched = search(&root, findString);
if(searched == NULL) {
printf("No_such_key\n");
free(findString);
}
else {
printNode(searched);
free(findString);
}
break;
樹初始化(通過文件解析):
/* Loop through each line in the file*/
while(fgets(buffer, sizeof(buffer), file) != NULL) {
tempToken = strtok(buffer, " \n");
while(tempToken != NULL) {
/* Assign default values */
curr = (node *)malloc(sizeof(node));
curr->left = curr->right = NULL;
curr->key = malloc(sizeof(char)*strlen(tempToken)+1); /* +1 for '\0' */
strcpy(curr->key, tempToken);
curr->frequency = 1;
/* Insert node into tree */
insert(&root, curr);
/* Get next token */
tempToken = strtok(NULL, " \n");
}
}
/* Test insertion worked; close file */
print_inorder(root);
fclose(file);
插入功能:
void insert(node ** tree, node * item)
{
/* If no root, item is root */
if(!(*tree)) {
*tree = item;
return;
}
/* If item value is less than node in tree, assign to left */
if(strcmp(item->key,(*tree)->key) < 0) {
insert(&(*tree)->left, item);
}
else if(strcmp(item->key,(*tree)->key) > 0) {
insert(&(*tree)->right, item);
}
else if(strcmp(item->key,(*tree)->key) == 0) {
(*tree)->frequency++;
}
}
打印功能顯示插入功能正常。
您應該測試'如果(*樹== NULL)'開頭搭上了空子樹的情況。爲什麼你在這裏使用雙指針呢?你的函數不修改樹。 – 2014-11-23 07:40:32
我認爲你應該確保樹的構建是正確的 - 單元測試? – 2014-11-23 07:41:42
我不是在搜索整棵樹嗎?或者我只需要使用一個節點:根。從那裏我可以遍歷到根的孩子,等等? – Plaidypus 2014-11-23 07:42:26