在BST中查找字符串

时间:2013-12-03 23:24:21

标签: c binary-search-tree

我已经建立了一个BST,可以保存专辑名称和年份,并根据年份构建。但我想输入专辑名称,它应该给一年。 所以我构建了这个代码部分:

int FindString(treeAlbum *node,char albumTitle[])
{

    FindString(node->Left,albumTitle);
    FindString(node->Right,albumTitle);
    if(!strcpy( node->albumTitle, albumTitle))
    {
        return node->year;
    }
}

和treeAlbum结构

struct treeAlbum{
        char albumTitle[100];
        int year;
        struct treeAlbum *Left;
        struct treeAlbum *Right; 
}

最后,此代码给出错误(Segmentation Fault)。我怎样才能解决这个问题 ?谢谢。

3 个答案:

答案 0 :(得分:1)

我对分段错误的最佳猜测是你没有检查你的基本情况。

int FindString(treeAlbum *node,char albumTitle[])
{
    if (!node)
    {
        // Return something sane here
        return ERROR_NOT_FOUND;
    }

    FindString(node->Left,albumTitle);
    FindString(node->Right,albumTitle);
    if(!strcpy( node->albumTitle, albumTitle))
    {
        return node->year;
    }
}

但是,您的代码还有其他一些问题:

  1. 您对递归调用FindString的返回值做了什么。现在你什么也没做。
  2. 您使用的是strcpy,但您的意思可能是strcmp
  3. 您有一个二叉搜索树,但您正在进行修复后搜索。这与树的大小呈线性关系,但您应该能够使用BST的排序来获取log(n)二叉树搜索。也就是说,查看当前节点的相册,看看你是否已经完成,应该向左搜索,还是向右搜索。

答案 1 :(得分:0)

您在FindString中所做的第一件事是再次使用FindString致电node->Leftnode->Left最终是null(如果树构造正确),这将导致段错误,或者它是树中的早期节点(在这种情况下,您的递归将导致堆栈填满)。当然需要检查空案例!

答案 2 :(得分:0)

您想使用strcmp,而不是strcpy。您应该评估两个FindString()来电的结果,并在他们失败时继续。