避免在二叉搜索树中插入重复项

时间:2015-03-27 23:11:01

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

所以我有一个完美的二元搜索树,除了我不想插入重复的事实。我曾尝试过几种方法来做这件事,但似乎无法弄明白。

我想要做的是先插入我的搜索方法,然后再插入要检查的内容,如果不是,那么插入方法会插入课程。

有谁知道一个很好的方法来解决这个问题?我的逻辑是否正确?

这是我的插入方法:

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);
    }
}

提前致谢

2 个答案:

答案 0 :(得分:0)

在循环结束时的插入方法中,当您尝试插入副本时,y中的课程编号将等于z中的课程编号。如果是这种情况,请不要做任何事情(除非您当前分配它,否则即使您不需要它也会删除z。)

答案 1 :(得分:0)

我建议在循环中检查是否相等,而不是跟随>=链,如果没有插入则返回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; 
 }