我不太清楚如何刪除二叉搜索樹中的節點。我已經規定,以消除任何Student對象小於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::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())
感謝您的答覆,我會怎麼過,作爲我的主刪除參數的數據/信息等級? – Riggy
bool刪除(value_type&data) { return remove(root,data); } – lanant
我的意思是當我打電話給student_tree-> remove()時,它需要一個參數,我不知道那個參數是什麼 – Riggy