Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 双参数二叉树(C+;+;)的插入函数_C++_Nodes_Binary Search Tree - Fatal编程技术网

C++ 双参数二叉树(C+;+;)的插入函数

C++ 双参数二叉树(C+;+;)的插入函数,c++,nodes,binary-search-tree,C++,Nodes,Binary Search Tree,我正在尝试为二进制搜索树实现一个插入函数。虽然我的逻辑看起来应该是可行的,但当我尝试通过一个tester函数运行它,将它转换成一个成对的列表时,我总是得到一个太大的列表大小。这似乎只有在我尝试插入多个重复的键时才会发生,即2个“猫”和2个“鱼”,否则它的工作原理是完美的 void insert (K k, V v) { TreeNode<K,V> * treeNode = new TreeNode<K,V> (k,v); TreeNode<K,V>

我正在尝试为二进制搜索树实现一个插入函数。虽然我的逻辑看起来应该是可行的,但当我尝试通过一个tester函数运行它,将它转换成一个成对的列表时,我总是得到一个太大的列表大小。这似乎只有在我尝试插入多个重复的键时才会发生,即2个“猫”和2个“鱼”,否则它的工作原理是完美的

void insert (K k, V v)
{


  TreeNode<K,V> * treeNode = new TreeNode<K,V> (k,v);
  TreeNode<K,V> *temp=NULL;
  TreeNode<K,V> *prev=NULL;
  temp = root;

  while(temp) { 
    prev = temp;
    if(temp->key == treeNode->key)
    {
        temp->value = treeNode->value;
        sizeCount--;
        cout<<"REPLACEMENT MADE"<<endl;  //This outputs as many times as it should
        return; //This is what I was missing

    }
    if (temp->key < treeNode->key)
      {
        temp = temp->right;
      }
    else
      {
      temp = temp->left;
      }

  }

  if (prev==NULL)
    {root = treeNode;heightCount++;}
  else {
    if (prev->key<treeNode->key)
      {
        prev->right = treeNode;  

      }
    if(prev->key>treeNode->key)
      {
        prev->left = treeNode;

      }


  } 

    sizeCount++;

}
void插入(K,V)
{
TreeNode*TreeNode=新的TreeNode(k,v);
TreeNode*temp=NULL;
TreeNode*prev=NULL;
温度=根;
while(temp){
prev=温度;
如果(临时->键==树节点->键)
{
温度->值=树节点->值;
大小计数--;
考夫特;
}
}
if(prev==NULL)
{root=treeNode;heightCount++;}
否则{
如果(上一个->键)
{
上->右=树节点;
}
如果(上一个->键>树节点->键)
{
上一个->左=树节点;
}
} 
sizeCount++;
}

我会注意到,我似乎很难在紧凑的代码和提供足够的信息之间取得良好的平衡。如果需要,我可以提供更多代码。

插入树中已有的键时,将替换该节点的值。但是您没有退出带有return的函数,因此
将继续执行。由于
temp->key
等于
treeNode->key
,因此您可以输入
else
temp=temp->left发生。然后,当执行超时时,您的代码实际上可能会生成错误的结构


解决方案是添加
return
到实际进行替换的位置。

替换值时为什么要更改
sizeCount
?我更新了代码,因为sizeCount总是在函数末尾递增。压缩代码时错误地删除了一行。我还要注意,sizeCount虽然没有在问题区域中使用,但实际上总是显示正确的值。所以我得到了适当的替换和大小输出,但不是当它转换成一个列表时…所以当你制作列表时可能会发生错误?伙计,你完全不知道这有多神奇。现在已经快凌晨4点了,我从午夜开始一直在努力让代码正常工作。那一行的改变就做到了。请加上这个作为答案,我想选择它。谢谢,谢谢,谢谢!!