µ±Ç°Î»ÖãºÊ×Ò³ > ¿ª·¢½Ì³Ì > CÓïÑÔ >

C++Êý¾Ý½á¹¹Ö®ËÑË÷¶þ²æÊ÷µÄʵÏÖ

ʱ¼ä£º2022-05-24 11:32 À´Ô´£ºÎ´Öª ×÷ÕߣºÎÞí¦ ÊÕ²Ø

Á˽âËÑË÷¶þ²æÊ÷ÊÇΪÁËSTLÖеÄmapºÍset×öÆÌµæ£¬ÎÒÃÇËùÊìÖªµÄAVLÊ÷ºÍƽºâËÑË÷¶þ²æÊ÷Ò²ÐèÒªËÑË÷¶þ²æÊ÷µÄ»ù´¡¡£±¾ÎĽ«Ïê½âÈçºÎÀûÓÃC++ʵÏÖËÑË÷¶þ²æÊ÷£¬ÐèÒªµÄ¿ÉÒԲο¼Ò»ÏÂ

Áã.ǰÑÔ

Á˽âËÑË÷¶þ²æÊ÷ÊÇΪÁËSTLÖеÄmapºÍset×öÆÌµæ£¬ÎÒÃÇËùÊìÖªµÄAVLÊ÷ºÍƽºâËÑË÷¶þ²æÊ÷Ò²ÐèÒªËÑË÷¶þ²æÊ÷µÄ»ù´¡£¬±¾ÎľÍÀ´½¨Á¢Ò»¿ÃËÑË÷¶þ²æÊ÷¡£

1.¸ÅÄî

ËÑË÷¶þ²æÊ÷ÓÖ³ÆÎª¶þ²æÅÅÐòÊ÷£¬Ëü»òÕßÊÇÒ»¿Ã¿ÕÊ÷£¬»òÕß¾ßÓÐÈçÏÂÐÔÖÊ£º

1.ÈôÆä×ó×ÓÊ÷²»Îª¿Õ£¬Ôò×ó×ÓÊ÷ÉÏËùÓнڵãµÄÖµ¶¼Ð¡ÓÚ¸ù½ÚµãµÄÖµ¡£

2.ÈôÆäÓÒ×ÓÊ÷²»Îª¿Õ£¬ÔòÓÒ×ÓÊ÷ÉÏËùÓнڵãµÄÖµ¶¼´óÓÚ¸ù½ÚµãµÄÖµ¡£

3.ËüµÄ×óÓÒ×ÓÊ÷Ò²·Ö±ðΪ¶þ²æËÑË÷Ê÷¡£

2.×÷ÓÃ

1.ËÑË÷£ºÍ¨¹ýËÑË÷¶þ²æÊ÷µÄÐÔÖÊÀ´½øÐÐËÑË÷¡£

2.ÅÅÐò£º¶þ²æËÑË÷Ê÷µÄÖÐÐò±éÀú¾ÍÊǽ«ËùÓÐÊý¾Ý½øÐÐÅÅÐò¡£

3.µü´úʵÏÖ

(1)²éÕÒ

¶Ô¶þ²æËÑË÷Ê÷µÄ½Úµã½øÐвéÕÒ£º

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
    }

(2)²åÈë

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
    }

(3)ɾ³ý

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)
    }

4.µÝ¹éʵÏÖ

(1)²éÕÒ

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
    }

(2)²åÈë

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
    }

(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)
	}
}

5.key/valueÄ£Ð͵ÄÓ¦ÓÃ

key/valueÄ£ÐÍ£¬¼´ÔÚÔ­À´kµÄ»ù´¡ÉÏ£¬Ã¿¸ö½ÚµãÔÙ´øÓÐÒ»¸övalueÖµ¡£ÓÐÁ½ÖÖÖ÷ÒªµÄÓ¦Óãº

(1)¶ÔÓ¦²éÕÒ

ÀûÓõ½Á˶þ²æËÑË÷Ê÷ËÑËØµÄÐÔÖÊ¡£

    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À´¹¹½¨¶þ²æËÑË÷Ê÷£¬Èç¹ûËÑË÷µ½ÁËÔò´òÓ¡ÖÐÎÄÊÍÒ壬ÕâÑù¾Í¼òµ¥¹¹³ÉÁËÒ»¸ö×ֵ䡣

(2)ÅжϳöÏÖ´ÎÊý

µ±ÎÒÃÇÅжÏÒ»¸öÊý×éÖи÷¸öÔªËØ³öÏֵĴÎÊýµÄʱºò£¬Ò²¿ÉÒÔʹÓõ½¶þ²æËÑË÷Ê÷¡£

    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µÄÖµ++¡£×îÖÕͳ¼Æ³ö¸÷¸öÔªËØ³öÏֵĴÎÊý¡£

6.×ܽá

¶ÔÓÚ¶þ²æËÑË÷Ê÷µÄÀí½â¶ÔÒÔºóѧϰAVLÊ÷ºÍºìºÚÊ÷¾ßÓкܴóµÄ°ïÖú

µ½´ËÕâÆª¹ØÓÚC++Êý¾Ý½á¹¹Ö®ËÑË÷¶þ²æÊ÷µÄʵÏÖµÄÎÄÕ¾ͽéÉܵ½ÕâÁË,¸ü¶àÏà¹ØC++ËÑË÷¶þ²æÊ÷ÄÚÈÝÇëËÑË÷Ô´ÂëËѲØÍøÒÔǰµÄÎÄÕ»ò¼ÌÐøä¯ÀÀÏÂÃæµÄÏà¹ØÎÄÕÂÏ£Íû´ó¼ÒÒÔºó¶à¶àÖ§³ÖÔ´ÂëËѲØÍø£¡


ÏÂһƪ£ºÃ»ÓÐÁË

CÓïÑÔÔĶÁÅÅÐÐ

×îÐÂÎÄÕÂ