【问题标题】:Insert Function of Dual-Parameter Binary Tree (C++)双参数二叉树的插入函数(C++)
【发布时间】:2014-12-03 10:41:10
【问题描述】:

我正在尝试为二叉搜索树实现插入函数。虽然我的逻辑看起来应该可以工作,但是当我尝试通过一个将它变成配对列表的测试器函数运行它时,我不断得到一个太大的列表大小。这似乎只发生在我尝试插入多个重复键时,即 2 个“cat”实例和 2 个“fish”实例,否则它可以完美运行。

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++;

}

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

【问题讨论】:

  • 替换值时为什么要更改sizeCount
  • 我已经更新了代码,这是因为 sizeCount 总是在函数结束时递增。压缩代码时误删了一行。
  • 我还要注意 sizeCount 虽然没有在问题区域中使用,但实际上总是显示正确的值。所以我得到了正确的 REPLACEMENT 和 size 输出,但不是当它转换成列表时......
  • 所以在制作列表时可能会出错?
  • 老兄,你完全不知道这有多神奇。现在快凌晨 4 点了,我从午夜开始就一直在工作,试图让这段代码正常工作。那一行更改做到了。请将此添加为答案,我想选择它。谢谢,谢谢,谢谢!

标签: c++ nodes binary-search-tree


【解决方案1】:

当您插入已经存在于树中的键时,您会替换该节点的值。但是你没有用 return 退出函数,所以while 继续执行。因为temp-&gt;key 等于treeNode-&gt;key,所以你输入elsetemp = temp-&gt;left; 发生。然后,当执行结束时,您的代码实际上可能会产生不正确的结构。

解决方法是在实际替换的地方加上return;

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多