- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在 C++ 中使用空节点的构造函数编写二叉搜索树,该构造函数将主数组插入其中并打印结果,至少这是我的意图。如前所述,我遇到了这两个错误,如果可能的话,需要将它们更正为规范。需要做的是创建一个 node_t * 构造函数并将数组插入到二叉搜索树中。
错误:没有匹配函数调用 'BST::insert(BST&, std::array::value_type&)'
错误:没有用于调用“BST::print_bst(BST&)”的匹配函数
#include <cstdio>
#include <cstdlib>
#include <array>
using namespace std;
/*
* Define a node structure for double linked list.
*/
class BST
{
private:
typedef struct node {
int val;
struct node* left;
struct node* right;
} node_t;
node_t* tree;
public:
BST() { tree = NULL; }
node_t* newNode(int val);
node_t* insert(node_t* cur_root, int val);
node_t* find_node(int val, node_t* root);
node_t* find_val(int val, node_t* root);
node_t* delete_node(int val, node_t* root);
void delete_bst(node_t* root);
void print_bst(node_t* root);
node_t* find_max(node_t* root);
};
// Creates a new node from a given value, allocating heap memory
// for it.
BST::node_t* BST::newNode(int val)
{
node_t* newNode = new node;
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// Inserts a new value into a given binary search tree,
// allocating heap memory for it.
BST::node_t* BST::insert(BST::node_t* cur_root, int val)
{
if(cur_root == NULL) { return newNode(val); }
if( val <= cur_root->val )
cur_root->left = insert(cur_root->left, val);
else if( val > cur_root->val)
cur_root->right = insert(cur_root->right, val);
return cur_root;
}
BST::node_t* BST::find_node(int val, BST::node_t* root) {
if (root == NULL || root->val == val) { return root; }
else if (root->val <= val) {
return find_node( val, root->left );
}
else { return find_node( val, root->right ); }
return root;
}
BST::node_t* BST::find_max(BST::node_t* root)
{
if(root == NULL)
return NULL;
while(root->right != NULL)
{
root = root->right;
}
return root;
}
// Deletes node and reorders bst
BST::node_t* BST::delete_node(int val, BST::node_t* root)
{
if( root == NULL ) return root;
else if( val <= root->val )
root->left = delete_node( val, root->left );
else if( val > root->val )
root->right = delete_node( val, root->right );
else
{
// No child
if( root->right == NULL && root->left == NULL )
{
delete root;
root = NULL;
}
// One child
else if(root->right == NULL)
{
node_t* temp = root;
root = root->left;
delete temp;
}
else if( root->left == NULL )
{
node_t* temp = root;
root = root->right;
delete temp;
}
// Two child
else
{
node_t* temp = find_max(root->left);
root->val = temp->val;
root->left = delete_node(temp->val, root->left);
}
}
return root;
}
// Given a pointer to the root, frees the memory associated with
// an entire tree.
void BST::delete_bst(BST::node_t* root) {
if(root != NULL)
{
delete_bst( root->left );
delete_bst( root->right );
delete(root);
if( root->left != NULL)
root->left = NULL;
if( root->right != NULL)
root-> right = NULL;
root = NULL;
}
}
/* Given a pointer to the root, prints all of
* the values in a tree.
*/
void BST::print_bst(BST::node_t* root)
{
if (root != NULL) {
printf("%d ", root->val);
print_bst(root->left);
print_bst(root->right);
}
}
int main()
{
BST bst;
array<int, 9> ai = {17, 9, 23, 5, 11, 21, 27, 20, 22};
for( size_t i = 0; i < ai.size(); ++i)
{
bst.insert(bst, ai[i]);
}
BST::print_bst(bst);
}
最佳答案
error: no matching function for call to 'BST::insert(BST&, std::array::value_type&)'
error: no matching function for call to 'BST::print_bst(BST&)'
insert
和
print_bst
在
main()
错了。具体来说,您有:
for( size_t i = 0; i < ai.size(); ++i)
{
bst.insert(bst, ai[i]);
}
BST::print_bst(bst);
BST::print_bst(bst);
.从语法的角度来看,您不使用解析运算符
bst.print_bst(bst);
(这只是冰山一角)
insert
和
print_bst
参数
bst
,
BST
类型的对象不是
node_t *
.你要传递给他们的是
tree
,但你不能因为
tree
是私有(private)的。
tree
的地址。用于功能,例如
public:
...
node_t *get_root (void) { return tree; } /* tree accessor */
insert
和
print_bst
如下:
for (size_t i = 0; i < ai.size(); i++)
bst.insert (bst.get_root(), ai[i]);
bst.print_bst (bst.get_root());
putchar ('\n'); /* make your program POSIX compliant with final '\n' */
}
-Wshadow
进行编译。以确保您不会隐藏或尝试在另一个范围内重新声明变量。你在这里有这个问题:
BST::node_t* BST::newNode(int val)
{
node_t* newNode = new node;
newNode
影响您的成员函数
newNode
,例如
public:
...
node_t* newNode(int val);
newNode
中声明的新节点至
newnode
(或任何不与您的成员函数冲突的东西)。虽然在这里使用它的方式不是问题,但如果您不检查阴影名称,它可能会咬你。
BST
对象,
tree
是指向二叉树开头的指针,但您永远不会将二叉树的开头(或其他任何东西)分配给
tree
.你最终调用
insert
一遍又一遍
cur_root == NULL
并返回
return newNode(val);
没有在任何地方使用,所以结果是
cur_root
总是
NULL
.相反,您需要检查
tree == NULL
并设置
tree = newNode (val);
如果是。如果你想返回指针只是
return (tree = newNode (val));
,例如
/* Inserts a new value into a given binary search tree,
* allocating heap memory for it.
*/
BST::node_t *BST::insert (BST::node_t *cur_root, int val)
{
if (tree == NULL) /* you must assign 1st node to tree */
return (tree = newNode(val));
if (cur_root == NULL)
return (cur_root = newNode(val));
if (val <= cur_root->val )
cur_root->left = insert (cur_root->left, val);
else if (val > cur_root->val)
cur_root->right = insert (cur_root->right, val);
return cur_root;
}
node_t* insert(node_t* cur_root, int val);
node_t* find_node(int val, node_t* root);
(node_t* cur_root, int val)
,但这取决于你。如果您喜欢
(int val, node_t* root)
,然后使用它,但要保持一致。
BST::delete_bst
在您将它们释放以将它们设置为
NULL
后尝试访问这些值,例如
// Given a pointer to the root, frees the memory associated with
// an entire tree.
void BST::delete_bst(BST::node_t* root) {
if(root != NULL)
{
delete_bst( root->left );
delete_bst( root->right );
delete(root);
if( root->left != NULL)
root->left = NULL;
if( root->right != NULL)
root-> right = NULL;
root = NULL;
}
}
root->left = NULL;
时和
root-> right = NULL;
和
root = NULL;
,这些内存块不再存在。
tree = NULL;
在最后,
/* Given a pointer to the root, frees the memory associated with
* an entire tree.
*/
void BST::delete_bst (BST::node_t *root)
{
if (root != NULL) {
delete_bst (root->left);
delete_bst (root->right);
delete(root);
}
tree = NULL;
}
valgrind
这样的内存错误检查程序来发现这些问题。在 Linux 上。 (但显然,您的代码必须先编译才能执行此操作)。每个操作系统都有类似的程序。
'\n'
.否则,当从控制台运行时,您的提示符会卡在最后一行输出的末尾。您可以简单地添加
putchar ('\n');
在
main()
结尾(因为您没有包含
<iostream>
)或为
print_bst
编写一个简单的包装函数这对你有用,例如
public:
...
void print_tree (void) { print_bst (tree); putchar ('\n'); };
bst.print_tree();
在
main()
并且不必担心。
#include <cstdio>
#include <cstdlib>
#include <array>
using namespace std;
/*
* Define a node structure for a binary tree list.
*/
class BST
{
private:
typedef struct node {
int val;
struct node* left;
struct node* right;
} node_t;
node_t *tree;
public:
BST() { tree = NULL; }
~BST() { delete_bst (tree); } /* if you define BST(), define ~BST() */
node_t *get_root (void) { return tree; } /* tree accessor */
node_t *newNode (int val);
node_t *insert (node_t* cur_root, int val);
node_t *find_node (node_t* root, int val);
node_t *find_val (node_t* root, int val);
node_t *delete_node (node_t* root, int val);
void delete_bst (node_t* root);
void print_bst (node_t* root);
node_t *find_max (node_t* root);
/* make program output POSIX compliant with final '\n'
* (just create a wrapper for print_bst, or add putchar('\n') in main )
*/
void print_tree (void) { print_bst (tree); putchar ('\n'); };
};
/* Creates a new node from a given value, allocating heap memory for it. */
BST::node_t* BST::newNode (int val)
{
node_t* newnode = new node_t;
newnode->val = val;
newnode->left = NULL;
newnode->right = NULL;
return newnode;
}
/* Inserts a new value into a given binary search tree,
* allocating heap memory for it.
*/
BST::node_t *BST::insert (BST::node_t *cur_root, int val)
{
if (tree == NULL) /* you must assign 1st node to tree */
return (tree = newNode(val));
if (cur_root == NULL)
return (cur_root = newNode(val));
if (val <= cur_root->val )
cur_root->left = insert (cur_root->left, val);
else if (val > cur_root->val)
cur_root->right = insert (cur_root->right, val);
return cur_root;
}
/* determine whether node with value exists in tree
* (don't swap parameter order -- it's confusing)
*/
BST::node_t *BST::find_node (BST::node_t *root, int val)
{
if (root == NULL || root->val == val)
return root;
else if (root->val <= val) {
return find_node (root->left, val);
}
else
return find_node (root->right, val);
return root;
}
/* determine maximum value in the tree */
BST::node_t* BST::find_max (BST::node_t* root)
{
if (root == NULL)
return NULL;
while (root->right != NULL)
root = root->right;
return root;
}
/* Deletes node and reorders bst */
BST::node_t* BST::delete_node (BST::node_t* root, int val)
{
if (root == NULL)
return root;
else if (val <= root->val)
root->left = delete_node (root->left, val);
else if (val > root->val)
root->right = delete_node (root->right, val);
else {
// No child
if (root->right == NULL && root->left == NULL) {
delete root;
root = NULL;
}
// One child
else if (root->right == NULL) {
node_t *temp = root;
root = root->left;
delete temp;
}
else if (root->left == NULL) {
node_t *temp = root;
root = root->right;
delete temp;
}
// Two child
else {
node_t *temp = find_max (root->left);
root->val = temp->val;
root->left = delete_node (root->left, temp->val);
}
}
return root;
}
/* Given a pointer to the root, frees the memory associated with
* an entire tree.
*/
void BST::delete_bst (BST::node_t *root)
{
if (root != NULL) {
delete_bst (root->left);
delete_bst (root->right);
delete(root);
}
tree = NULL;
}
/* Given a pointer to the root, prints all of
* the values in a tree.
*/
void BST::print_bst (BST::node_t *root)
{
if (root != NULL) {
printf ("%d ", root->val);
print_bst (root->left);
print_bst (root->right);
}
}
int main (void) {
BST bst;
array<int, 9> ai = {17, 9, 23, 5, 11, 21, 27, 20, 22};
for (size_t i = 0; i < ai.size(); i++)
bst.insert (bst.get_root(), ai[i]);
bst.print_tree(); /* POSIX comliant output w/final '\n'
* use wrapper function, or just putchar('\n') here
*/
}
$ ./bin/arr_bst
17 9 5 11 23 21 20 22 27
$ valgrind ./bin/arr_bst
==8123== Memcheck, a memory error detector
==8123== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==8123== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==8123== Command: ./bin/arr_bst
==8123==
17 9 5 11 23 21 20 22 27
==8123==
==8123== HEAP SUMMARY:
==8123== in use at exit: 0 bytes in 0 blocks
==8123== total heap usage: 10 allocs, 10 frees, 72,920 bytes allocated
==8123==
==8123== All heap blocks were freed -- no leaks are possible
==8123==
==8123== For counts of detected and suppressed errors, rerun with: -v
==8123== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
关于c++ - 二叉搜索树没有匹配的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51462122/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!