我正在尝试在我的代码中创建一个循环结构方法来遍历二叉搜索树。但是我在编译时遇到错误并且不确定原因是什么。
我在.h文件的私有部分中有Node* findNode(const Node *, const Object &);
和
Node* BSTree::findNode(const Node* current, const Object &target){
if(*current->item == target)
return current;
Node* temp = NULL;
if(current->nodeLeft != NULL){
temp = findNode(current->nodeLeft, target);
if(temp != NULL)
return temp;
}
if(current->nodeRight != NULL){
temp = findNode(current->nodeRight, target);
if(temp != NULL)
return temp;
}
return NULL;
}
在cpp。
我正在生成以下错误:
-error C2143:语法错误:缺少';'在'*'之前
-error C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int
-error C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int
-error C2556:'int * BSTree :: findNode(const BSTree :: Node *,const Object&)':重载函数的区别仅在于'BSTree :: Node * BSTree :: findNode(const BSTree :: Node)的返回类型*,const Object&)'
编译器错误都指向cpp中代码的第一行。我试着查找错误代码,但是我没有找到任何可以回答我的问题的原因。
导致错误的原因是什么,我的编译器在'int BSTree'读取它而不是Node * BSTree?我是在制作语法错误还是忘记包含?目前我只包括iostream和fstream。
我提前感谢任何花时间阅读此内容的人。
编辑:
回答科林的问题。
我的.cpp
中有#include“BSTree.h”在.h我有:
#ifndef BSTREE_H
#define BSTREE_H
#include <iostream>
#include <fstream>
答案 0 :(得分:3)
从错误判断,您似乎已在Node
结构中声明了BSTree
。我认为你的问题在于你的回归类型。尝试将返回类型声明为BSTree::Node*
。
答案 1 :(得分:2)
您已经得到了问题的答案。我将添加一些关于我如何编写代码的内容。我更喜欢这样的东西:
Node* BSTree::findNode(const Node* current, const Object &target){
if (current == NULL)
return NULL;
if (target < current->item)
return findNode(current->left, target);
if (current->item < target)
return findNode(current->right, target);
return current;
}
这可能(可能)继续递归到current == NULL
,而不是在current->left == NULL
或current->right == NULL
时尝试停止,具体取决于选择的方向。虽然这可以节省一个级别的递归,但它需要复制几乎所有的递归到左右分支的逻辑来执行此操作。除非你真的确定递归是非常昂贵的,否则检查当前节点是否为NULL可以通过合并这两个来简化代码。此版本的代码还具有以下优势(与大多数C ++容器一样),只需要Object
来定义operator<
,而不是operator==
。
如果您想更进一步,可以将指针放在数组中的左右分支,并进一步简化代码:
// presumes BSTree::Node is defined something like this:
class BSTree {
class Node {
// subnodes[0] == left subtree
// subnodes[1] == right subtree
Node subnodes[2];
};
};
BSTree::Node* BSTree::findNode(const Node* current, const Object &target){
if (current == NULL)
return NULL;
if (current->item == target)
return current;
return findNode(subnodes[target < current->item]);
}