我不太确定如何在二叉搜索树中删除节点。我已指定删除任何等级值小于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())
答案 0 :(得分:0)
看起来你的函数调用和参数都没问题。
但是,看起来您只是选择遍历树的某些路径。如果要删除包含等级小于50的所有节点,则必须遍历整个树,如下所示: return remove(cNode-&gt; get_left(),data)|| remove(cNode-&gt; get_right(),data);
然后您将拥有基本案例,您已经有了正确的案例: if(cNode == NULL) 返回false;
然后,您将检查cNode的等级是否小于50.如果是,请将其删除,然后返回true。
- 我假设您有一名学生以及每个节点中的数据/成绩信息