C++ C++;二叉搜索树和指针
你能告诉我为什么存在对binaryTree.5方法的调用吗代码>说“5在二叉树中不存在”?调试时,就像尝试访问插入5的节点不再存在一样。我不明白为什么。谢谢你C++ C++;二叉搜索树和指针,c++,binary-search-tree,C++,Binary Search Tree,你能告诉我为什么存在对binaryTree.5方法的调用吗说“5在二叉树中不存在”?调试时,就像尝试访问插入5的节点不再存在一样。我不明白为什么。谢谢你 #include <iostream> using namespace std; class Node { private: int _value; Node* left; Node* right; public: Node(int value)
#include <iostream>
using namespace std;
class Node
{
private:
int _value;
Node* left;
Node* right;
public:
Node(int value):_value(value), left(NULL), right(NULL)
{
}
Node* returnLeftChild()
{
return left;
}
Node* returnRightChild()
{
return right;
}
void setLeftChild(Node* l)
{
left=l;
}
void setRightChild(Node* r)
{
right=r;
}
int getValue()
{
return _value;
}
};
class BinaryTree
{
private:
Node parent;
void AddToOneTree(Node* parent, int value)
{
if (value==parent->getValue())
{
return;
}
if (value>parent->getValue())
{
if (parent->returnRightChild()==NULL)
{
Node newNode(value);
parent->setRightChild(&newNode);
return;
}
else
{
AddToOneTree(parent->returnRightChild(), value);
}
}
if (value<parent->getValue())
{
if (parent->returnLeftChild()==NULL)
{
Node newNode(value);
parent->setLeftChild(&newNode);
return;
}
else
{
AddToOneTree(parent->returnLeftChild(), value);
}
}
}
void LookForValue(Node* parent, int value, bool found)
{
if (value>parent->getValue())
{
if (parent->returnRightChild()!=NULL)
{
if (parent->returnRightChild()->getValue()==value)
{
found= true;
goto HERE;
}
else
{
LookForValue(parent->returnRightChild(), value, found);
}
}
}
else if (value<parent->getValue())
{
if (parent->returnLeftChild()!=NULL)
{
if (parent->returnLeftChild()->getValue()==value)
{
found= true;
goto HERE;
}
else
{
LookForValue(parent->returnLeftChild(), value, found);
}
}
}
HERE:;
}
public:
BinaryTree(int parentValue):parent(parentValue)
{
}
void Add(int value)
{
AddToOneTree(&parent, value);
}
void Exists(int value)
{
bool found = false;
if (parent.getValue()==value)
{
cout << value << " exists in the Binary Tree." << endl;
}
else{
LookForValue(&parent, value, found);
if (found)
{
cout << value << " exists in the Binary Tree." << endl;
}else
{
cout << value << " doesn't exist in the Binary Tree." << endl;
}
}
}
};
int main()
{
BinaryTree binaryTree(9);
binaryTree.Add(5);
binaryTree.Add(5);
binaryTree.Exists(9);
binaryTree.Exists(5);
}
#包括
使用名称空间std;
类节点
{
私人:
int_值;
节点*左;
节点*右;
公众:
节点(int值):_值(value)、左(NULL)、右(NULL)
{
}
节点*returnLeftChild()
{
左转;
}
节点*returnRightChild()
{
返还权;
}
void setLeftChild(节点*l)
{
左=l;
}
void setRightChild(节点*r)
{
右=r;
}
int getValue()
{
返回_值;
}
};
类二叉树
{
私人:
节点父节点;
void AddToOneTree(节点*父节点,int值)
{
如果(值==parent->getValue())
{
返回;
}
如果(值>父项->获取值())
{
如果(父级->返回RightChild()==NULL)
{
节点newNode(值);
父节点->setRightChild(&newNode);
返回;
}
其他的
{
AddToOneTree(父->returnRightChild(),值);
}
}
if(valuegetValue())
{
if(parent->returnLeftChild()==NULL)
{
节点newNode(值);
父节点->setLeftChild(&newNode);
返回;
}
其他的
{
AddToOneTree(父->returnLeftChild(),值);
}
}
}
void LookForValue(节点*父节点,int值,bool found)
{
如果(值>父项->获取值())
{
if(parent->returnRightChild()!=NULL)
{
如果(父项->返回右项子项()->getValue()==值)
{
发现=真;
转到这里;
}
其他的
{
LookForValue(父级->returnRightChild(),值,已找到);
}
}
}
else if(valuegetValue())
{
if(parent->returnLeftChild()!=NULL)
{
如果(父项->返回左项子项()->getValue()==值)
{
发现=真;
转到这里;
}
其他的
{
LookForValue(父->returnLeftChild(),值,已找到);
}
}
}
在这里:;
}
公众:
二进制树(int parentValue):父(parentValue)
{
}
无效添加(int值)
{
AddToOneTree(父项和值);
}
存在void(int值)
{
bool-found=false;
if(parent.getValue()==value)
{
cout您应该替换此字符串:
void LookForValue(Node* parent, int value, bool found)
为此:
void LookForValue(Node* parent, int value, bool &found)
或者只需在LookForValue
函数中将返回值设置为bool
,并编写如下内容:
found = LookForValue(&parent, value, found);
bool LookForValue(Node* parent, int value, bool found)
{
if (value>parent->getValue())
{
if (parent->returnRightChild()!=NULL)
{
if (parent->returnRightChild()->getValue()==value)
{
return true ;
}
else
{
LookForValue(parent->returnRightChild(), value, found);
}
}
}
else if (value<parent->getValue())
{
if (parent->returnLeftChild()!=NULL)
{
if (parent->returnLeftChild()->getValue()==value)
{
return true ;
}
else
{
LookForValue(parent->returnLeftChild(), value, found);
}
}
}
}
bool LookForValue(Node* parent, int value, bool &found)
您的代码中有几个问题
第一个是,LookForValue
函数从不返回找到的布尔值。您可以将bool-found更改为bool&found,这样就不必返回任何内容,也可以将LookForValue
的返回类型更改为bool
,在这种情况下,您需要将代码更改为类似以下内容:
found = LookForValue(&parent, value, found);
bool LookForValue(Node* parent, int value, bool found)
{
if (value>parent->getValue())
{
if (parent->returnRightChild()!=NULL)
{
if (parent->returnRightChild()->getValue()==value)
{
return true ;
}
else
{
LookForValue(parent->returnRightChild(), value, found);
}
}
}
else if (value<parent->getValue())
{
if (parent->returnLeftChild()!=NULL)
{
if (parent->returnLeftChild()->getValue()==value)
{
return true ;
}
else
{
LookForValue(parent->returnLeftChild(), value, found);
}
}
}
}
bool LookForValue(Node* parent, int value, bool &found)
我还没有测试代码,所以可能还有其他问题
下次遇到这样的问题时,我建议您尝试使用gdb,因为它可能有助于检测您的代码真正在做什么,这样您就可以找出可能的错误。例如,在这里,您可以看到,在您的Exists
函数中,仅通过“打印”从未将find设置为true逐步查找变量的值
另外,我认为你设计类的方式并不太好。父类应该是一个指针,指向树的根。我建议你完全重新设计你的代码。你可以在网上找到一些好的实现,你可以把它们作为你的代码
最后,goto肯定是个坏主意……我也会摆脱它。至少函数AddToOneTree
是错误的,是程序未定义行为的原因
例如,在这个代码块中
if (parent->returnRightChild()==NULL)
{
Node newNode(value);
parent->setRightChild(&newNode);
return;
}
您创建了一个局部变量newNode
,并将其地址指定给右子级的指针。但是,由于该变量是局部变量,因此在控件离开代码块后它将被销毁,树中相应的指针将无效
您需要动态分配节点并将它们添加到树中
更好的设计是当类BinaryTree
包含一个指向树头的ponter时
class BinaryTree
{
private:
Node *parent;
^^^^^^^^
//...
并相应地重写该类。:)
您正在按值传递found
。这意味着将复制该值。当您在方法LookForValue
内部更改found
时,您仅更改此副本
void LookForValue(Node* parent, int value, bool& found)
这将通过引用进行查找,因此如果在LookForValue
中对其进行更改,Exists
方法中的原始值也将更改
您也可以只返回如下bool值:
found = LookForValue(&parent, value, found);
bool LookForValue(Node* parent, int value, bool found)
{
if (value>parent->getValue())
{
if (parent->returnRightChild()!=NULL)
{
if (parent->returnRightChild()->getValue()==value)
{
return true ;
}
else
{
LookForValue(parent->returnRightChild(), value, found);
}
}
}
else if (value<parent->getValue())
{
if (parent->returnLeftChild()!=NULL)
{
if (parent->returnLeftChild()->getValue()==value)
{
return true ;
}
else
{
LookForValue(parent->returnLeftChild(), value, found);
}
}
}
}
bool LookForValue(Node* parent, int value, bool &found)
然后只写返回true;
而不是
found= true;
goto HERE;
这样你也就摆脱了后顾之忧。谢谢大家。我有c