C++;二进制搜索树实现并没有添加每个元素 我有一个简单的C++实现BST。我只是想添加数字并打印出来。问题是,在我尝试添加的16个数字中,我只能添加12个(不包括32、15、14和3)。我的控制台的输出如下所示:

C++;二进制搜索树实现并没有添加每个元素 我有一个简单的C++实现BST。我只是想添加数字并打印出来。问题是,在我尝试添加的16个数字中,我只能添加12个(不包括32、15、14和3)。我的控制台的输出如下所示:,c++,binary-search-tree,C++,Binary Search Tree,在添加数字之前打印树:列表为 空已添加键32键15已经存在 已添加已添加键14键3已打开 已经添加了添加后按顺序打印树 编号:2421052647076808387100节目以结束 退出代码:0 #包括 使用名称空间std; BST级{ 私人: 结构节点{ int数据; 节点*左; 节点*右; }; 节点*根; void addLeafPrivate(int数据,节点*n); 无效printInOrderPrivate(节点*); 公众: BST(); 节点*createLeaf(int数据);

在添加数字之前打印树:
列表为 空
已添加键32
键15已经存在 已添加
已添加键14
键3已打开 已经添加了
添加后按顺序打印树 编号:
2421052647076808387100
节目以结束 退出代码:0

#包括
使用名称空间std;
BST级{
私人:
结构节点{
int数据;
节点*左;
节点*右;
};
节点*根;
void addLeafPrivate(int数据,节点*n);
无效printInOrderPrivate(节点*);
公众:
BST();
节点*createLeaf(int数据);
void addLeaf(int数据);
void printInOrder();
};
int main(){
int TreeKeys[16]={50,76,21,4,32,64,15,52,14,100,83,2,3,70,87,80};
英国理工学院;
cout right=NULL;
n->left=NULL;
返回n;
}
void BST::addLeaf(int数据){
addLeafPrivate(数据,根);
}
void BST::addLeafPrivate(int数据,节点*n){
if(root==NULL){
root=createLeaf(数据);
}
else如果(datadata){//在左侧递归添加。
如果(n->left!=NULL){
addLeafPrivate(数据,n->左侧);
}
else{//如果left为空
n->left=createLeaf(数据);
}
}
如果(数据>根->数据){//,则在左右侧递归添加。
如果(n->right!=NULL){
addLeafPrivate(数据,n->右侧);
}
否则{//right为空
n->right=createLeaf(数据);
}
}
否则{
不正确);
}
}
否则{
库特
应该是

else if (data > n->data) { // add recursively on right left side.
当您进入
32
时,问题就开始了。由于
21
已经离开
50
,因此当您执行
root->data
而不是正确的
n->data
时,您的算法认为它已经插入了
32
,而不是比较
data
值并引发异常

因此:检查左右两侧是否有
null
,比较
数据
是否大于或小于,并检查是否相等。这样做可以让您更容易找到类似这样的错误

应该是

else if (data > n->data) { // add recursively on right left side.
当您进入
32
时,问题就开始了。由于
21
已经离开
50
,因此当您执行
root->data
而不是正确的
n->data
时,您的算法认为它已经插入了
32
,而不是比较
data
值并引发异常


因此:检查左右两侧是否有
null
,比较
data
是否大于或小于,并检查是否相等。这样做可以让您更容易找到类似这样的错误。

我不确定原始代码是否粘贴得如此糟糕,但错误在代码正确格式化的瞬间就立即显现出来。如果源代码没有正确格式化,则“OP的格式不正确,这可能导致查找问题的困难。我同意。但是,我通过按照代码在脑海中创建树来“调试”它。但是,是的,当代码格式正确时,这是非常明显的。感谢您的回答和解释。我下次会更加小心。”(并正确格式化我的代码),但我感谢您的帮助!!我不确定原始代码是否粘贴得如此糟糕,但在代码正确格式化的那一刻,错误就立即显现出来了。如果源代码的OP格式不正确,这可能导致查找问题的困难。我同意。但是,我“调试过”它是通过按照代码在我的脑海中创建树来实现的。但是,是的,当代码正确格式化时,这是很明显的。谢谢你的回答和解释。下次我会更加小心(并正确格式化代码),但我感谢你的帮助!!
else if (data > n->data) { // add recursively on right left side.