【问题标题】:Avoid inserting duplicates in binary search tree避免在二叉搜索树中插入重复项
【发布时间】:2015-03-27 23:11:00
【问题描述】:

所以我有一个可以完美工作的二叉搜索树,除了我不想插入重复项。我已经尝试过几种方法来做到这一点,但似乎无法弄清楚。

我要做的是在插入任何要检查的内容之前先调用我的搜索方法,如果不存在则让 insert 方法插入课程。

有人知道解决这个问题的好方法吗?我的逻辑对吗?

这是我的插入方法:

bool BinarySearchTree::treeInsert(string courseNumber, string courseTitle)
 {
Course * z = new Course(courseNumber, courseTitle);
Course *x, *y;
y = NULL;
x = root;

while (x != NULL){
    y = x;
    if(z->getCourseNumber() < y->getCourseNumber()){
        x = x->getLeft();
    } else{
        x = x->getRight();
    }
}
z->setParent(y);

if (y == NULL){
    root = z;
} else if (z->getCourseNumber() < y->getCourseNumber()){
        y->setLeft(z);
    }
    else {
        y->setRight(z);
    }
}

提前致谢

【问题讨论】:

  • 一个问题是,在您知道自己将需要它之前,您就分配了一个新的Course。如果找到重复项,则说明存在内存泄漏。
  • 免费线索:“if(z->getCourseNumber() == y->getCourseNumber())”会发生什么?

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


【解决方案1】:

我建议检查循环中的相等性,而不是遵循&gt;= 的链,如果没有插入则返回false。新元素的创建只有在确定它会被使用时才会被创建:

 bool BinarySearchTree::treeInsert(string courseNumber, string courseTitle)
 {
     Course *x=root, *y=nullptr;

     while (x != NULL) {
         y = x;
         if(courseNumber < y->getCourseNumber())
             x = x->getLeft();
         else if(courseNumber==y->getCourseNumber()) 
             return false;
         else x = x->getRight();
     }
     Course * z = new Course(courseNumber, courseTitle);
     z->setParent(y);
     if (y == NULL)
         root = z;
     else if (z->getCourseNumber() < y->getCourseNumber())
            y->setLeft(z);
     else   y->setRight(z);
     return true; 
 }

【讨论】:

    【解决方案2】:

    在循环末尾的插入方法中,当您尝试插入重复项时,y 中的课程编号将等于 z 中的课程编号。如果是这种情况,请不要做任何事情(删除z,因为您当前已分配它,即使您不需要它)。

    【讨论】:

    • 在确认没有重复之前,不应完成新对象的分配。这可能没有错,但是无缘无故分配一个全新的对象肯定是浪费。唯一需要搜索的是课程编号,而不是整个对象。
    • @PaulMcKenzie 我同意,我只是没有像你在 cmets 中所说的那样把它放进去。
    • 虽然我们无法判断courseNumber字符串是否可以与getCourseNumber成员函数进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2012-04-24
    相关资源
    最近更新 更多