C中BST的链接列表:广度优先搜索

时间:2014-04-16 17:17:31

标签: c linked-list queue binary-search-tree breadth-first-search

我正在编写一个程序,它是二叉搜索树的链表。我们应该在树中搜索一个数字并打印找到的树和行号。因此,我们应该使用广度优先搜索功能。我的出队功能出现了分段错误,我不确定原因。

这些是我的结构:

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级中找到它的值,依此类推。   - >基本上,您必须在所有二叉树中搜索给定值,一个     一次一级,同时在链表中。“

所以我不确定我是否需要搜索整棵树,然后继续前进,或者逐行查看每棵树。

1 个答案:

答案 0 :(得分:0)

从我对代码的表面看起来,它看起来一般都好(虽然我会以不同的方式实现一些部分),但dequeue()中的最后一行肯定是错误的:

first = temp;
newBST = first->treeNode;
free(temp);
return first->treeNode;

在最后一行访问first->treeNode是灾难性的:first包含一个已被释放的地址(tempfirst指向相同的内存位置)。我想你想要回复newBST

return newBST; 

你可能会抛出first,因为它似乎毫无用处,然后把它变成:

newBST = temp->treeNode;
free(temp);
return newBST;