繁体   English   中英

搜索二叉搜索树

[英]search a Binary search tree

我正在尝试在密钥中查找名称。 我认为这很好。 但是,找不到它。 也许我的代码在某处是错误的?

if (database.retrieve(name, aData))  // both contain the match

main()

static void retrieveItem(char *name, data& aData)
{
cout << ">>> retrieve " << name << endl << endl;
if (database.retrieve(name, aData))            // name and aData both contain the match
    cout << aData << endl;
else
    cout << "not found\n";
cout << endl;
     }

     static void removeItem(char *name)
    {
cout << ">>> remove " << name << endl << endl;
if (database.remove(name))
    cout << name << " removed\n";
else
    cout << name << " not found\n";
cout << endl;
    }

   int main()
   {
   #ifdef _WIN32
// request memory leak report in Output Window after main returns
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
   #endif

data    aData;


     << "Database Of Great Computer Scientists\n\n";

database.insert(data("Ralston, Anthony"));
database.insert(data("Liang, Li"));
database.insert(data("Jones, Doug"));
database.insert(data("Goble, Colin"));
database.insert(data("Knuth, Donald"));
database.insert(data("Kay, Alan"));
database.insert(data("Von Neumann, John"));
database.insert(data("Trigoboff, Michael"));
database.insert(data("Turing, Alan"));
displayDatabase(true);
retrieveItem("Trigoboff, Michael", aData);
retrieveItem("Kaye, Danny", aData);

removeItem("Ralston, Anthony");
displayDatabase(true);

检索功能...

bool BST::retrieve(const char *key, data &aData, int parent) const
 {

for(int index=0; index < maxsize+1; index++)
{

    if (!items[index].empty) 
    {


        if ( items[index].instanceData == key )
        {
            aData.setName(key);
            return true;                   // doesn't return right away
        }


    }

}


 }

并在data.cpp中定义

bool operator== (const data& d1, const data& d2)
{

return strcmp(d1.getName(), d2.getName()) == 0;

}

所以main()内的这段代码是在我认为应该正确工作时找不到的地方。 name和aData都包含找到的正确名称。

static void retrieveItem(char *name, data& aData)
{
cout << ">>> retrieve " << name << endl << endl;
if (database.retrieve(name, aData))            // name and aData both contain the match
    cout << aData << endl;
else
    cout << "not found\n";
cout << endl;
     }

您应该使用BST在树中导航-而不像其他人所说的那样遍历数组中的每个项目。 尝试类似:

bool retrieve(key, aData)
  retrieve(key, aData, parent)
  if (key == aData)
    return true
  else
    return false

bool retrieve(key, aData, parent)
  if (key == items[parent].name)
    aData.setName(key)
  else if (key < items[parent].name)
    retrieve(key, aData, 2*parent+1)
  else
    retrieve(key, aData, 2*parent+2)

那应该运作良好! :)

我不是C ++专家,但是您的==运算符是否正在实际评估中? 它本来需要两个const数据引用,但是您似乎正在比较items[index].instanceDatachar*

我建议您对操作员进行一些登录,看看它是否真正被调用了-我怀疑不是这样。

暂时使==运算符脱离方程式的一种方法是使比较显式:

 if (strcmp(items[index].instanceData.getName(), key) == 0)
 {
     ...
 }

另一方面,我完全看不到它实际上是如何进行二进制搜索的。 它看起来对我来说,这只是一个简单的列表-你正在做一个线性搜索中retrieve ,而不是比较关键和去向左或向右倒树(或返回“发现”),根据结果。

我不能确定没有看到BST的代码,但这看起来是错误的:

for(int index=0; index < maxsize+1; index++)

按照传统惯例,应为:

for(int index=0; index < maxsize; index++)

除此之外,您的函数似乎还返回true或一些未定义的布尔值。 您可能应该return false; 在BST :: retrieve的末尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM