Á˽âËÑË÷¶þ²æÊ÷ÊÇΪÁËSTLÖеÄmapºÍset×öÆÌµæ£¬ÎÒÃÇËùÊìÖªµÄAVLÊ÷ºÍƽºâËÑË÷¶þ²æÊ÷Ò²ÐèÒªËÑË÷¶þ²æÊ÷µÄ»ù´¡£¬±¾ÎľÍÀ´½¨Á¢Ò»¿ÃËÑË÷¶þ²æÊ÷¡£
ËÑË÷¶þ²æÊ÷ÓÖ³ÆÎª¶þ²æÅÅÐòÊ÷£¬Ëü»òÕßÊÇÒ»¿Ã¿ÕÊ÷£¬»òÕß¾ßÓÐÈçÏÂÐÔÖÊ£º
1.ÈôÆä×ó×ÓÊ÷²»Îª¿Õ£¬Ôò×ó×ÓÊ÷ÉÏËùÓнڵãµÄÖµ¶¼Ð¡ÓÚ¸ù½ÚµãµÄÖµ¡£
2.ÈôÆäÓÒ×ÓÊ÷²»Îª¿Õ£¬ÔòÓÒ×ÓÊ÷ÉÏËùÓнڵãµÄÖµ¶¼´óÓÚ¸ù½ÚµãµÄÖµ¡£
3.ËüµÄ×óÓÒ×ÓÊ÷Ò²·Ö±ðΪ¶þ²æËÑË÷Ê÷¡£
1.ËÑË÷£ºÍ¨¹ýËÑË÷¶þ²æÊ÷µÄÐÔÖÊÀ´½øÐÐËÑË÷¡£
2.ÅÅÐò£º¶þ²æËÑË÷Ê÷µÄÖÐÐò±éÀú¾ÍÊǽ«ËùÓÐÊý¾Ý½øÐÐÅÅÐò¡£
¶Ô¶þ²æËÑË÷Ê÷µÄ½Úµã½øÐвéÕÒ£º
1.¶¨Òå²éÕÒ½ÚµãÖ¸Õëcur
2.±È½Ïcur->_kÓëÒª²éÕҵĽڵãkµÄÖµµÄ´óС¹ØÏµ£¬µ±_k<kµÄʱºò£¬curÖ¸Ïò¸Ã½ÚµãµÄÓÒ×ÓÊ÷£¬·ñÔòÖ¸Ïò×ó×ÓÊ÷¡£
3.²éÕҳɹ¦·µ»Øtrue£¬Ê§°Ü·µ»Øfalse
bool Find(const K& k)
{
Node* cur = _root;//1.
while (cur)//2.
{
if (cur->_k < k)
{
cur = cur->_right;
}
else if (cur->_k > k)
{
cur = cur->_left;
}
else
{
return true;//3
}
}
return false;//3
}
1.Åжϸù½ÚµãÖ¸ÕëÊÇ·ñΪ¿Õ¡£Èç¹ûΪ¿ÕÔòÖ±½Ó½«¸Ã½Úµã²åÈë¸ù½ÚµãλÖá£
2.¶¨Òå±éÀú½ÚµãcurÓëÆä¸¸½Úµãparent¡£
3.ÒÀ´ÎÅжϲåÈë½ÚµãµÄkÓ뵱ǰ½ÚµãcurµÄ´óС¾ö¶¨curÖ¸Ïòµ±Ç°½ÚµãµÄ×ó»òÕßÓҽڵ㡣²¢ÔڸıäcurÖ¸Ïò֮ǰ½«parent¸³ÖµÎªcur¡£
Èç¹û¶þ²æËÑË÷Ê÷ÖÐÒѾÓиÃÖµ£¬Ôò·µ»Øfalse¡£
4.µ±curΪ¿ÕµÄʱºò£¬½¨Á¢¸ù¾ÝkÔÚcur´¦½¨Á¢½Úµã¡£±È½ÏparentµÄ_kÓëkµÄ´óС£¬ÅжÏcur½¨Á¢ÔÚparentµÄ×ó×ÓÊ÷»¹ÊÇÓÒ×ÓÊ÷¡£²¢·µ»Øtrue¡£
bool InsertNode(const K& k)
{
if (_root == nullptr)
{
_root = new Node(k);
return true;
}//1
Node* cur = _root;
Node* parent = nullptr;//2
while (cur)
{
if (cur->_k < k)
{
parent = cur;
cur = cur->_right;
}
else if (cur->_k > k)
{
parent = cur;
cur = cur->_left;
}
else
{
return false;
}
}//3
cur = new Node(k);
if (parent->_k < k)
{
parent->_right = cur;
}
else
{
parent->_left = cur;
}
return true;//4
}
1.Ê×ÏÈͨ¹ýcurºÍparent²éÕҸýڵ㡣
2.Èç¹ûcur×óΪ¿Õ£¬ÅжÏcurÏà¶ÔÓÚparentµÄλÖ㬲¢½«curµÄÓÒ×ÓÊ÷¸³Öµµ½curÏà¶ÔÓÚparentµÄλÖô¦¡£²¢É¾³ýcur¡£
3.Èç¹ûcurÓÒΪ¿Õ£¬ÅжÏcurÏà¶ÔÓÚparentµÄλÖ㬲¢½«curµÄ×ó×ÓÊ÷¸³Öµµ½curÏà¶ÔÓÚparentµÄλÖô¦¡£²¢É¾³ýcur¡£
4.Èç¹ûcurµÄ×óÓÒ¶¼²»Îª¿Õ£º
(1)½¨Á¢Ò»¸öеĽڵãÖ¸Õëmin¸³ÖµÎªcur->right×÷Ϊ±éÀúÖ¸Õ룬ºÍÆä¸¸½ÚµãÖ¸Õëminparent¸³ÖµÎªcur¡£
(2)Ò»Ö±Ïò×ó±éÀúÖ±µ½min->leftΪ¿Õ¡£²¢½»»»minÓëcurµÄ_key¡£
(3)ÅжÏminÓëminparentµÄλÖùØÏµ£¬²¢½«minµÄÓÒ×ÓÊ÷·ÅÔڸô¦¡£
(4)ɾ³ýmin£¬·µ»Øtrue¡£ÈôûÕÒµ½·µ»Øfalse¡£
bool Erase(const K& k)
{
Node* cur = _root;
Node* parent = nullptr;
while (cur)
{
if (cur->_k < k)
{
parent = cur;
cur = cur->_right;
}
else if (cur->_k > k)
{
parent = cur;
cur = cur->_left;
}//1
else
{
if (cur->_left == nullptr)
{
if (parent == nullptr)
{
_root = cur->_right;
}
else if (parent->_right == cur)
{
parent->_right = cur->_right;
}
else
{
parent->_left = cur->_right;
}
delete cur;
return true;
}
else if (cur->_right == nullptr)
{
if (parent == nullptr)
{
_root = cur->_left;
}
else if (parent->_left == cur)
{
parent->_left = cur->_left;
}
else
{
parent->_right = cur->_left;
}
delete cur;
return true;
}//2
else
{
Node* min = cur->_right;
Node* minparent = cur;//4.(1)
while(min->_left)
{
minparent = min;
min = min->_left;
}//4.(2)
cur->_k = min->_k;
if (minparent->_left == min)
{
minparent->_left = min->_right;
}
else
{
minparent->_right = min->_right;
}//4.(3)
delete min;
return true;
}
}
}
return false;//4.(4)
}
1.ÅпÕ
2.ÅжÏroot->_kÓëkµÄ´óС£¬ÅжϵݹéµÄ·½Ïò¡£
3.Èç¹ûÕÒµ½ÁË·µ»Øroot½Úµã¡£
Node* _FindR(const K& k)
{
return FindR(_root, k);
}//1
Node* FindR(Node* root, const K& k)
{
if (root == nullptr)
{
return nullptr;
}
if (root->_k > k)
{
return FindR(root->_left, k);
}
else if (root->_k < k)
{
return FindR(root->_right, k);
}//2
else
{
return root;
}//3
}
1.ÅжϽڵãÊÇ·ñΪ¿Õ£¬Èç¹ûΪ¿Õ½«¸Ã½Úµã²åÈë½ÚµãµÄλÖᣲ¢·µ»Øtrue
2.ÅжÏ_kºÍkµÄ´óС£¬ÅжϵݹéµÄ·½Ïò¡£
3.Èç¹û½ÚµãÖµµÈÓÚk·µ»Øfalse¡£
bool InsertR(const K& k)
{
return _InsertR(_root, k);
}
bool _InsertR(Node*& root, const K& k)
{
if (root == nullptr)
{
root = new Node(k);
return true;
}//1
if (root->_k < k)
{
return _InsertR(root->_right, k);
}
else if (root->_k > k)
{
return _InsertR(root->_left, k);
}//2
else
{
return false;
}//3
}
1.Èç¹û½ÚµãΪ¿ÕÔò·µ»Øfalse
2.ͨ¹ý_kºÍkµÄ´óСÀ´Åжϵݹ鷽Ïò¡£
3.ÕÒµ½¸Ã½Úµã£º
(1)¶¨ÒådelÖ¸Õ븳ֵΪroot¡£
(2)Èç¹ûroot×ó×ÓÊ÷Ϊ¿Õ£¬Ôò½«rootÖ¸Ïò¸Ã½ÚµãµÄÓÒ×ÓÊ÷¡£
(3)Èç¹ûrootÓÒ×ÓÊ÷Ϊ¿Õ£¬Ôò½«rootÖ¸Ïò¸Ã½ÚµãµÄ×ó×ÓÊ÷¡£
(4)Èç¹ûroot×óÓÒ×ÓÊ÷¶¼²»Îª¿Õ£¬½«min¸³ÖµÎªroot->right£¬²¢ÒÀ´ÎÏò×óÕÒ£¬Ö±µ½min->leftΪ¿Õ¡£²¢½»»»minµÄkÓërootµÄk¡£ È»ºóµÝ¹éµ½ÓÒ×ÓÊ÷À´½øÐÐɾ³ý¡£
(5)ɾ³ýÔroot½Úµã(del)£¬²¢·µ»Øtrue¡£
bool EraseR(const K& k)
{
return _EraseR(_root, k);
}
bool _EraseR(Node*& root, const K& k)
{
if (root == nullptr)
return false;//1
if (root->_k < k)
{
return _EraseR(root->_right, k);
}
else if (root->_k > k)
{
return _EraseR(root->_left, k);
}//2
else
{
Node* del = root;//3.(1)
if (root->_left == nullptr)
{
root = root->_right;
}//3.(2)
else if (root->_right == nullptr)
{
root = root->_left;
}//3.(3)
else
{
Node* min = root->_right;
while (min->_left)
{
min = min->_left;
}
swap(min->_k, root->_k);
// µÝ¹éµ½ÓÒ×ÓÊ÷ȥɾ³ý
return _EraseR(root->_right, k);//3.(4)
}
delete del;
return true;//3.(5)
}
}
key/valueÄ£ÐÍ£¬¼´ÔÚÔÀ´kµÄ»ù´¡ÉÏ£¬Ã¿¸ö½ÚµãÔÙ´øÓÐÒ»¸övalueÖµ¡£ÓÐÁ½ÖÖÖ÷ÒªµÄÓ¦Óãº
ÀûÓõ½Á˶þ²æËÑË÷Ê÷ËÑËØµÄÐÔÖÊ¡£
BSTree<string, string> word;
word.InsertNode("man", "ÄÐÈË");
word.InsertNode("woman", "Å®ÈË");
word.InsertNode("sort", "ÅÅÐò");
word.InsertNode("Earth", "µØÇò");
word.InsertNode("birth", "³öÉú");
word.InsertNode("die", "ËÀÍö");
string str;
while (cin >> str)
{
BSTreeNode<string, string>* ret = word.Find(str);
if (ret)
{
cout << "¶ÔÓ¦µÄÖÐÎĽâÊÍ£º" << ret->_v << endl;
}
else
{
cout << "Î޴˵¥´Ê" << endl;
}
}
ÎÒÃÇÏò¶þ²æËÑË÷Ê÷ÖдæÈëÓ¢Îĵ¥´ÊºÍÖÐÎÄÊÍÒ壬½«Ó¢Îĵ¥´Ê×÷ΪkÀ´¹¹½¨¶þ²æËÑË÷Ê÷£¬Èç¹ûËÑË÷µ½ÁËÔò´òÓ¡ÖÐÎÄÊÍÒ壬ÕâÑù¾Í¼òµ¥¹¹³ÉÁËÒ»¸ö×ֵ䡣
µ±ÎÒÃÇÅжÏÒ»¸öÊý×éÖи÷¸öÔªËØ³öÏֵĴÎÊýµÄʱºò£¬Ò²¿ÉÒÔʹÓõ½¶þ²æËÑË÷Ê÷¡£
string arr[] = { "a","b","e","e","b","a","n","a","n","a","c","p","d","d","x","s","w","l" };
BSTree<string, int> counttree;
for (auto& str : arr)
{
auto ret = counttree.Find(str);
if (ret != nullptr)
{
(ret->_v)++;
}
else
{
counttree.InsertNode(str, 1);
}
}
counttree._InOrderv();
ÿһ´Î³öÏÖÒ»¸öÔªËØÎÒÃǾͽ«Ëü²åÈë¶þ²æËÑË÷Ê÷ÖУ¬²¢°ÑËüµÄvalue¸³ÖµÎª1£¬µ±µÚ¶þ´ÎÓöµ½Õâ¸öÔªËØµÄʱºò£¬ÔÚ¶þ²æËÑË÷Ê÷ÖÐËÑË÷¸ÃÔªËØ£¬ÈËÈç¹û¿ÉÒÔÕÒµ½¸ÃÔªËØÔò½«¸ÃÔªËØµÄvalueµÄÖµ++¡£×îÖÕͳ¼Æ³ö¸÷¸öÔªËØ³öÏֵĴÎÊý¡£
¶ÔÓÚ¶þ²æËÑË÷Ê÷µÄÀí½â¶ÔÒÔºóѧϰAVLÊ÷ºÍºìºÚÊ÷¾ßÓкܴóµÄ°ïÖú
µ½´ËÕâÆª¹ØÓÚC++Êý¾Ý½á¹¹Ö®ËÑË÷¶þ²æÊ÷µÄʵÏÖµÄÎÄÕ¾ͽéÉܵ½ÕâÁË,¸ü¶àÏà¹ØC++ËÑË÷¶þ²æÊ÷ÄÚÈÝÇëËÑË÷Ô´ÂëËѲØÍøÒÔǰµÄÎÄÕ»ò¼ÌÐøä¯ÀÀÏÂÃæµÄÏà¹ØÎÄÕÂÏ£Íû´ó¼ÒÒÔºó¶à¶àÖ§³ÖÔ´ÂëËѲØÍø£¡
ÈÈÃÅÔ´Âë