template <class T>
void BinaryTree<T>::UpdateKey(T newkey,T oldkey)
{
TreeNode<T> *temp,*temp1,*temp2,*temp3;
temp=Root;
//checking to see if the new value clashes with any existing value
while (temp!=NULL)
{
if (temp->key==newkey)
{
cout<<"New key already exists in the tree.CannotUpdate!";
cout<<endl;
return;
}
if (newkey>temp->key)
{
temp=temp->RightChild;
}
else if (newkey<temp->key)
{
temp=temp->LeftChild;
}
}
temp=Root;
while (temp!=NULL)
{
if (temp->key==oldkey)
{
temp1=temp->Parent;
temp->key=newkey;
if (temp1->LeftChild==temp) //if the node is the left child of its parent
{
if (temp1->key<temp->key)
{
//move to right child of node whose key has to be changed and
//then keep on moving to the LeftChild of every node until last
//node is reached and exchange the key/value
temp=temp->RightChild;
while (temp->LeftChild!=NULL)
{
temp=temp->LeftChild;
}
//exchanging key/value of the two nodes
temp2=temp;
temp3=temp1->LeftChild;
temp->key=temp3->key;
temp->value=temp3->value;
temp3->key=temp2->key;
temp3->value=temp2->value;
}
cout<<"Value updated successfully1"<<endl;
return;
}
//if the node is right child of its parent
else if (temp1->RightChild==temp)
{
//if key of parent is greater than its right child
if (temp1->key>temp->key)
{
//move to the leftchild of the node whose value has to change
//and then keep moving to right child until the last node
temp=temp->LeftChild;
while (temp->RightChild!=NULL)
{
temp=temp->RightChild;
}
//exchange value/key of the last node with the node whose value
//is updated
temp2=temp;
temp3=temp1->RightChild;
temp->key=temp3->key;
temp->value=temp3->value;
temp3->key=temp2->key;
temp3->value=temp2->value;
}
cout<<"Value updated successfully2<<endl;
return;
}
//comparing newkey with the left child to see if its less than the latter
if (temp->LeftChild!=NULL && newkey<(temp->LeftChild)->key)
{
temp->key=newkey;
temp1=temp;
temp=temp->LeftChild;
while (temp->RightChild!=NULL)
{
temp=temp->RightChild;
}
temp2=temp1;
temp1->key=temp->key;
temp1->value=temp->value;
temp->key=temp2->key;
temp->value=temp2->value;
cout<<"Value updated successfully3"<<endl;
return;
}
//comparing with the right child if it is greater than the latter
//and moving key/value to the right spot if condition is met
else if (temp->RightChild!=NULL && newkey>(temp->RightChild)->key)
{
temp->key=newkey;
temp1=temp;
while (temp->LeftChild!=NULL)
{
temp=temp->LeftChild;
}
temp2=temp1;
temp1->key=temp->key;
temp1->value=temp->value;
temp->key=temp2->key;
temp->value=temp2->value;
cout<<"Value updated successfully4"<<endl;
return;
}
}
//traversing the tree by comparing oldkey with node key and going in the right
//direction
if (oldkey<temp->key)
temp=temp->LeftChild;
else if (oldkey>temp->key)
temp=temp->RightChild;
}
}
我使用一个字符串后跟一个数字来构建BST树,因此节点有一个键/值对。问题是当我更新节点时(即更改节点的键并重新排列节点,以便它在树上的正确位置),它没有正确地给它那个键,因为当我搜索该键(使用搜索功能;我的搜索功能工作正常,我已经彻底测试了),我在树中没有匹配的密钥。我已经为其他一些功能提供了帮助,可以在这里找到它们:
Binary Search Tree--delete function not working