我编写了在二叉树上执行各种操作的程序。在开始时,我设置空根指针,然后调用几个insert()
函数,将新节点添加到树中。
最后,我调用search()
函数找到所请求的结构节点并返回它。
insert()
函数有两个参数 - 对根指针的引用,以及常量的int键,它将被转换为节点结构并添加到树中
search()
函数采用“常量根指针” - 不是引用,因为我想直接操作本地指针,我不希望它被更改。它需要的另一个参数是int key。
这是整个计划:
#include <iostream>
struct node
{
node *p; // parent
node *left, *right;
int key;
};
void insert(node *&root, const int key)
{
node newElement = {};
newElement.key = key;
node *y = NULL;
while(root)
{
if(key == root->key) exit(EXIT_FAILURE);
y = root;
root = (key < root->key) ? root->left : root->right;
}
newElement.p = y;
if(!y) root = &newElement;
else if(key < y->key) y->left = &newElement;
else y->right = &newElement;
}
node* search(const node *root, const int key)
{
while( (root) && (root->key != key) )
root = (key < root->key) ? root->left : root->right;
return root;
}
int main()
{
using namespace std;
node *root = NULL;
insert(root, 5);
insert(root, 2);
cout << search(root, 5)->key << endl;
return 0;
}
我的问题是 - 为什么搜索功能不起作用?它显示错误 - 返回值类型与函数类型不匹配。但是,我就像宣言中所说的那样,回归了诗人!
此外,"const"
关键字是o.k。?
答案 0 :(得分:2)
root
为const node*
,您的返回值为node*
。它应该更改为const node*
。
const node* search(const node *root, const int key);
如果您需要search
函数来返回非const node
,那么它需要采用非const node
参数。您可以提供重载以实现两种可能性
node* search(node *root, const int key);
答案 1 :(得分:1)
由于返回相同的指针,因此不能使用const参数和非const返回。而是编写两个版本,一个是const,一个是非const。
这是const_cast合理的少数情况之一。编写搜索功能的两个版本,一个可以使用const_cast调用另一个版本。
const node* search(const node *root, const int key)
{
while( (root) && (root->key != key) )
root = (key < root->key) ? root->left : root->right;
return root;
}
node* search(node *root, const int key)
{
return const_cast<node *>(search(const_cast<const node *>(root), key));
}
答案 2 :(得分:0)
在search
内,变量root
是const node*
。但是,您尝试将其作为node*
返回。你不能这样做,因为它会违反const-correctness。如果您返回指向真正const
对象的指针,则客户端将能够修改该对象。
相反,您需要让函数返回const node*
。要么是这样,要么root
应该只是node*
。