C ++:使用递归搜索功能更新二叉搜索树?

时间:2015-11-05 04:39:04

标签: c++ templates binary-search-tree

我正在制作一个存储MechPart类型的项目的二叉搜索树,它存储了一个int quantity和一个字符串code。通过从文本文件中读取并存储其数据来生成MechParts。一个名为MonthlyUpdate.txt的单独文本文件用于读取树中的MechPart列表,然后更新它们的数量。例如:

  

MechPart A0001的数量= 12

     

MonthlyUpdate.txt表示A0001的数量= 6

     

运行更新功能,在树中找到A0001

     

将其替换为更新后的数量值6(12 - 6)。

这是执行此任务的两个功能:

    void DBInterface::updateFromFile(string f_Name) 
{
    ifstream file (f_Name.c_str());
    string line;

    MechPart tmp_mp;

    if (file.is_open())
    {
        std::getline(file, line);
        while (std::getline (file, line))
        {
            std::istringstream iss (line);
            int q=0;
            int pos=0;
            pos = line.find('\t',0); //find position of blank space
            string tmp_str = line.substr(0,pos); //create a substring
            string tmp_str1 = line.substr((pos+1), string::npos);
            stringstream ss (tmp_str1);
            ss >> q;

            tmp_mp.set_code(tmp_str); //set code
            tmp_mp.set_quantity(q);
            MechPart currentQuantity;
            currentQuantity = tree.quantitySearch(tree.getRoot(), tmp_mp);
            tmp_mp.set_quantity((currentQuantity.get_quantity()) + q);

            tree.update(tree.getRoot(), tmp_mp);
            cout << "Current node data: " << tmp_mp.get_code() << " | " << tmp_mp.get_quantity() << endl;


        }
    }

和BSTree.template:

template <typename Item>
Item BSTree<Item>::quantitySearch(BTNode<Item>* q_ptr, Item obj)
{
    if (q_ptr == NULL)
    {
    //POINTER IS NULL
    }
    else if (q_ptr->data() == obj)
    {
        return q_ptr->data();
    }

    else if (obj > q_ptr->data()) 
    { //WORK ON RIGHT SIDE
        quantitySearch(q_ptr->get_right(), obj);
    }
    else
    {
    //work on left side
        quantitySearch(q_ptr->get_left(), obj);

    }

}

搜索遍历树并找到与参数相同的部件名MechPart的{​​{1}},然后返回code。 我一直在通过GDB调试器运行代码。我让它显示MechPart以验证返回的currentQuantity.get_quantity()数量是否正确,但由于某种原因,我的数字非常大。令我困惑的是,在MechPart构造函数中,它将值0赋给MechPart

最终quantity函数给我一个分段错误,所以这里有些错误,但我还无法解决这个问题。

1 个答案:

答案 0 :(得分:1)

递归函数需要将其递归调用返回给调用者才能使其正常工作。查看递归的经典阶乘示例:

int factorial(int n) {
    if (n == 1) {
        return 1;
    }
    else {
        return n*factorial(n-1);
    }
}

正如其他人所指出的,您的quantitySearch函数只返回q_ptr->data()但从不返回递归quantitySearch调用的返回值。我会从那里开始,我强烈建议在递归函数中添加cout语句,以全面了解“幕后”发生的事情