我正在编写一个程序,它是二叉搜索树的链表。我们应该在树中搜索一个数字并打印找到的树和行号。因此,我们应该使用广度优先搜索功能。我的出队功能出现了分段错误,我不确定原因。
这些是我的结构:
typedef struct BST {
int value;
int treeNum;
struct BST* left;
struct BST* right;
}BST;
typedef struct rootList{
struct BST* root;
struct rootList* next;
}rootList;
typedef struct bfsQ{
struct BST* treeNode;
struct bfsQ* next;
}bfsQ;
这是我的BFS功能:
void BFS(rootList* listHead, int searchValue)
{
if(listHead->root == NULL)
{
printf("%d/tNO/tN/A/tN/A\n", searchValue);
}
else
{
bfsQ* newQueue = NULL;
BST* temp = NULL;
newQueue = malloc(sizeof(bfsQ));
newQueue->next = NULL;
enqueue(&newQueue, listHead->root);
while(newQueue != NULL)
{
temp = dequeue(&newQueue);
printf("Did this work?");
if(temp->value == searchValue)
printf("HI I WAS FOUND");
else
{
if(temp->left != NULL)
enqueue(&newQueue, temp->left);
if(temp->right != NULL)
enqueue(&newQueue, temp->right);
}
}
BFS(listHead->next, searchValue);
}
}
这是我的候选人:
void enqueue(bfsQ** qHead, BST* new_tree_node)
{
bfsQ *temp = malloc(sizeof(bfsQ));
BST *node;
temp->treeNode = new_tree_node;
temp->next = *qHead;
*qHead = temp;
node = temp->treeNode;
printf("%d\n", node->value);
}
这是我的出队:
BST* dequeue(bfsQ** qHead)
{
bfsQ *temp, *first;
BST *newBST;
temp = (*qHead);
while(temp->next != NULL)
{
printf("THIS IS NOT NULL YET\n");
temp = temp->next;
}
first = temp;
newBST = first->treeNode;
free(temp);
return first->treeNode;
}
我做错了什么? enqueue工作正常,但我的dequeue没有正确存储。
编辑:显然我需要:
“此函数实现逐级搜索的变体或正式实现 被称为BREADTH FIRST SEARCH。 - >此函数在二叉树中搜索给定值,然后执行此操作 通过在每个二叉树中搜索级别1,然后移动到级别2,如果 它无法在1级中找到它的值,依此类推。 - >基本上,您必须在所有二叉树中搜索给定值,一个 一次一级,同时在链表中。“
所以我不确定我是否需要搜索整棵树,然后继续前进,或者逐行查看每棵树。
答案 0 :(得分:0)
从我对代码的表面看起来,它看起来一般都好(虽然我会以不同的方式实现一些部分),但dequeue()
中的最后一行肯定是错误的:
first = temp;
newBST = first->treeNode;
free(temp);
return first->treeNode;
在最后一行访问first->treeNode
是灾难性的:first
包含一个已被释放的地址(temp
和first
指向相同的内存位置)。我想你想要回复newBST
:
return newBST;
你可能会抛出first
,因为它似乎毫无用处,然后把它变成:
newBST = temp->treeNode;
free(temp);
return newBST;