删除二进制搜索树中的多个节点

时间:2016-11-06 06:11:33

标签: c++ binary-search-tree

我不太确定如何在二叉搜索树中删除节点。我已指定删除任何等级值小于50的学生对象。 这是我的删除功能

bool remove(BTNode<value_type>* cNode, value_type& data)
{
    if(cNode == NULL)
    {
        return false;
    }

    if(data.get_name() > cNode->get_data().get_name())
    {
        remove(cNode->get_right(), data);
    }
    else if(data.get_name() < cNode->get_data().get_name())
    {
        remove(cNode->get_left(), data);
    }
    else
    {
        if(cNode->is_leaf())
        {
            if(root->get_data().get_name() == data.get_name())
            {
                root = NULL;
            }
            else
            {
                if(cNode->is_right_child())
                {
                    cNode->get_parent()->set_right(NULL);
                }
                else
                {
                    cNode->get_parent()->set_right(NULL);
                }
            }
            delete cNode ;
            size--;
        }
        else if(cNode->has_one_child())
        {
            if(root->get_data().get_name() == data.get_name())
            {
                if(cNode->get_right()!= NULL)
                {
                    cNode->get_right()->set_parent(NULL);
                    root = cNode->get_right();
                }
                else
                {
                    cNode->get_left()->set_parent(NULL);
                    root = cNode->get_left();
                }
            }
            else if(cNode->get_right() != NULL)
            {
                cNode->get_right()->set_parent(cNode->get_parent());
                if(cNode->is_right_child())
                {
                    cNode->get_parent()->set_right(cNode->get_right());
                }
                else
                {
                    cNode->get_parent()->set_left(cNode->get_left());
                }
            }
            else
            {
                BTNode<value_type>* tempNode = find_min(cNode->get_right());
                value_type* tempStudent = new value_type (tempNode->get_data());
                remove(cNode->get_right(), tempNode->get_data());
                cNode->set_data(*tempStudent);
            }
            return true;
        }
        return false;
    }
}

递归调用它
bool remove(value_type& data)
{
    return remove(root, data);
}

我试图删除的学生对象是这样构建的

Student::Student(std::string init_name)
{
    name = init_name;
    grade = rand() % 101;
}

在我的主要功能中我有

BSTree<Student>* student_tree = new BSTree<Student>;
std::string studentName[]={"Adam", "Cameron", "Jackson", "KiSoon", "Nicholas", "Adrian", "Chris", "Jacob", "Lance", "Ryan",
                           "Alexander", "Damian", "James", "Liam", "Sang", "Andrew", "David", "Jared", "Madison", "Shane", "Ashley", "Dillon",
                           "Jodi", "Magdalena", "Simon", "Benjamin", "Dylan", "Jonathan",  "Marcus", "Thomas", "Bradley", "Ethan", "Joshua", "Mark",
                           "Timothy", "Brobie", "Frederik", "Julius", "Melanie", "Trent", "Callan", "Hong", "Kelly", "Min", "Troy", "Callum", "Hugh", "Kenias", "Mitchell", "Zaanif"};

for (int i = 49; i > 0; i--)
{ 
    int j = rand() % (i+1);
    std::string tmp = studentName[j];
    studentName[j] = studentName[i];
    studentName[i] = tmp;
} 

for (int i = 0; i < 50; i++)
{
    Student student = Student(studentName[i]);
    student_tree->insert(student, i);
}

cout << student_tree->printInOrder() << endl;
//cout << "test" << endl;
cout << "HD's: " << student_tree->hdCount() << endl;
cout << "Average: " << student_tree->avg() << endl;
student_tree->remove();

我不知道要传递什么作为删除参数。我认为它是等级小于50的学生的名字,但我不确定如何循环并获取这些名称并将它们放入函数调用中。

编辑:在删除中,我应该检查节点的名称和传入的数据或节点和数据的等级是否通过?即if(data.get_name() > cNode->get_data().get_name())if(data.get_grade() > cNode->get_data().get_grade())

1 个答案:

答案 0 :(得分:0)

看起来你的函数调用和参数都没问题。

但是,看起来您只是选择遍历树的某些路径。如果要删除包含等级小于50的所有节点,则必须遍历整个树,如下所示: return remove(cNode-&gt; get_left(),data)|| remove(cNode-&gt; get_right(),data);

然后您将拥有基本案例,您已经有了正确的案例: if(cNode == NULL)     返回false;

然后,您将检查cNode的等级是否小于50.如果是,请将其删除,然后返回true。

- 我假设您有一名学生以及每个节点中的数据/成绩信息