C ++递归函数返回值

时间:2016-12-29 20:09:14

标签: c++ pointers recursion binary-search-tree return-value

作为一个家庭作业,我正在实现一个二叉搜索树,并且正在寻找一些数据的位置(以后能够修改/删除它),这是我的一段代码:

node*& bst::search(data& x, node*& pos) {
    if (pos->get().num == x.num) {
        return pos;
    }
    if (pos->right != NULL) search(x, pos->right);
    if (pos->left != NULL) search(x, pos->left);
}

在源文件中,我调用search(data_to_find, root)。在我的例子中,我有一个这种形式的整数树:

1
 2
  3

根指向1.当我想搜索元素3时,我希望得到指向3的指针,但每次这个函数都返回根本身。然后我想也许这与foo的第一个实例没有返回值有关,所以我将search(x, pos->right)更改为return search(x, pos->right)并将左侧相同,这次一切正常。这让我很困惑,我试着用以下虚拟函数做几次运行,只是为了理解它会返回什么

int foo(int x = 0) {
    if (x == 1) {
        return x;
    }
    x++;
    foo(x);
}

虽然我还没有指定在if语句为false的情况下返回什么,但它仍然有效并输出1.我想也许foo(0)只返回递归中返回的foo(1),检查我是否尝试过这个:

int boo() {
    return 1;
}

int foo() {
    boo();
}

并调用foo(),这导致" foo必须返回一个值"错误,显然正在将boo()更改为return boo()修复它。所以我的问题是为什么输出root的第一个案例?为什么第二种情况甚至有效?

1 个答案:

答案 0 :(得分:3)

您遇到的问题是您不会将递归调用的返回值传播回原始调用者。实际上,当这些调用返回时,该值将被丢弃。

更糟糕的是,在你找不到匹配的情况下,你的功能就像写入的那样无法返回任何内容,这是未定义的行为。获得根节点这一事实更像是编译器的怪癖或当前的内存布局,而不是定义的结果。

正如@Mike所指出的,对于二叉树,您应该只在搜索中遍历一个子树,具体取决于您的搜索值是大于还是小于当前节点所持有的值。传统上,左树保存的值小于当前节点,而右树保存的值更大。