作为一个家庭作业,我正在实现一个二叉搜索树,并且正在寻找一些数据的位置(以后能够修改/删除它),这是我的一段代码:
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的第一个案例?为什么第二种情况甚至有效?
答案 0 :(得分:3)
您遇到的问题是您不会将递归调用的返回值传播回原始调用者。实际上,当这些调用返回时,该值将被丢弃。
更糟糕的是,在你找不到匹配的情况下,你的功能就像写入的那样无法返回任何内容,这是未定义的行为。获得根节点这一事实更像是编译器的怪癖或当前的内存布局,而不是定义的结果。
正如@Mike所指出的,对于二叉树,您应该只在搜索中遍历一个子树,具体取决于您的搜索值是大于还是小于当前节点所持有的值。传统上,左树保存的值小于当前节点,而右树保存的值更大。