【问题标题】:Recursive function crashing in C++C ++中的递归函数崩溃
【发布时间】:2023-03-30 18:55:01
【问题描述】:

在尝试调用一个简单的程序来测试我找到第一个比作为参数给出的节点更小的节点的方法之后:

BinaryTreeMap <int, int> m;
m[5] = 5;
m[3] = 3;
m[8] = 8;
m[1] = 1;
m[2] = 2;
m[6] = 6;
cout << m.firstSmaller(5) << " ";
cout<< m.firstSmaller(6);
cout << " " << m.firstSmaller(3) << " ";
cout << m.firstSmaller(12);

...我的程序崩溃了,没有错误,什么都没有。我认为我正在通过不正确退出递归函数来制造某种无限循环。但是我不知道在哪里,因为当我尝试在一张纸上按照我的方法进行时,我得到了正确的结果。

方法如下:

template <typename TipKey,typename TipValue>
TypeValue BinaryTreeMap<TipKey,TipValue>::firstSmaller(TypeKey key)
{
BSNode *pom = functionforFirstSmaller(root, key);
if(pom == 0) throw "There is no key smaller than the given one!";
return pom->value;
}

以及FirstSmaller的函数:

BSNode* functionforFirstSmaller(BSNode *c, TypeKey k)
{
    if(c->left == 0 && c->right == 0) return c;
    if(c == 0) return 0;
    if(c->key >= k) return functionforFirstSmaller(c->left, k);
    BSNode *cvor = functionforFirstSmaller(c->right, k);
    //if(cvor == 0) return 0;
    return cvor;
}

我不明白它为什么会崩溃。如果你们能帮助我理解,我将不胜感激,因为它将帮助我进一步编程。 抱歉,如果解释不好,请习惯 C++ 中的英语词汇(不是我的母语)。

【问题讨论】:

  • firstSmaller() 中的根是什么?
  • Root 是整个二叉树的根。如果我要找的键比它小,它应该在左边的子树中。
  • 尝试在递归函数中打印一些输出。它将帮助您识别何时失败
  • c == 0 有可能吗?因为它是一个指针,所以对我来说看起来很奇怪。 pom == 0 相同
  • 似乎当 c=3 然后尝试调用 functionforFirstSmaller(3->right, k), 3->right 实际上是 null ,但是,我没有解决这个问题在前 2 个 if 中?

标签: c++ pointers recursion binary-tree


【解决方案1】:

您似乎已经反转了两行代码。试试:

BSNode* functionforFirstSmaller(BSNode *c, TypeKey k)
{
    if (c == 0) return 0;
    if (c->left == 0 && c->right == 0) return c;
    if (c->key >= k) return functionforFirstSmaller(c->left, k);
    BSNode *cvor = functionforFirstSmaller(c->right, k);
    return cvor;
}

【讨论】:

  • 仍然崩溃,但感谢您的回答。我相信我通过尝试获取空指针而犯了一些错误。一定是这样的。现在会尝试修复它。
猜你喜欢
  • 2011-11-24
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多