{"id":4575,"date":"2020-09-07T15:05:32","date_gmt":"2020-09-07T07:05:32","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=4575"},"modified":"2020-09-07T15:05:32","modified_gmt":"2020-09-07T07:05:32","slug":"stl%e4%b8%ad%e7%ba%a2%e9%bb%91%e6%a0%91%e7%9a%84%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/4575","title":{"rendered":"STL\u4e2d\u7ea2\u9ed1\u6811\u7684\u5b9e\u73b0"},"content":{"rendered":"<p>\u4ee5\u4e0b\u4ee3\u7801\u6765\u81ea\uff1axtree<\/p>\n<p>\u5de6\u65cb\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void _Lrotate(_Nodeptr _Wherenode) noexcept { \/\/ promote right node to root of subtree\r\n        _Nodeptr _Pnode    = _Wherenode-&gt;_Right;\r\n        _Wherenode-&gt;_Right = _Pnode-&gt;_Left;\r\n\r\n        if (!_Pnode-&gt;_Left-&gt;_Isnil) {\r\n            _Pnode-&gt;_Left-&gt;_Parent = _Wherenode;\r\n        }\r\n\r\n        _Pnode-&gt;_Parent = _Wherenode-&gt;_Parent;\r\n\r\n        if (_Wherenode == _Myhead-&gt;_Parent) {\r\n            _Myhead-&gt;_Parent = _Pnode;\r\n        } else if (_Wherenode == _Wherenode-&gt;_Parent-&gt;_Left) {\r\n            _Wherenode-&gt;_Parent-&gt;_Left = _Pnode;\r\n        } else {\r\n            _Wherenode-&gt;_Parent-&gt;_Right = _Pnode;\r\n        }\r\n\r\n        _Pnode-&gt;_Left       = _Wherenode;\r\n        _Wherenode-&gt;_Parent = _Pnode;\r\n    }<\/pre>\n<p>&nbsp;<\/p>\n<p>\u53f3\u65cb\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void _Rrotate(_Nodeptr _Wherenode) noexcept { \/\/ promote left node to root of subtree\r\n        _Nodeptr _Pnode   = _Wherenode-&gt;_Left;\r\n        _Wherenode-&gt;_Left = _Pnode-&gt;_Right;\r\n\r\n        if (!_Pnode-&gt;_Right-&gt;_Isnil) {\r\n            _Pnode-&gt;_Right-&gt;_Parent = _Wherenode;\r\n        }\r\n\r\n        _Pnode-&gt;_Parent = _Wherenode-&gt;_Parent;\r\n\r\n        if (_Wherenode == _Myhead-&gt;_Parent) {\r\n            _Myhead-&gt;_Parent = _Pnode;\r\n        } else if (_Wherenode == _Wherenode-&gt;_Parent-&gt;_Right) {\r\n            _Wherenode-&gt;_Parent-&gt;_Right = _Pnode;\r\n        } else {\r\n            _Wherenode-&gt;_Parent-&gt;_Left = _Pnode;\r\n        }\r\n\r\n        _Pnode-&gt;_Right      = _Wherenode;\r\n        _Wherenode-&gt;_Parent = _Pnode;\r\n    }<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">_Nodeptr _Extract(_Unchecked_const_iterator _Where) noexcept {\r\n    _Nodeptr _Erasednode = _Where._Ptr; \/\/ node to erase\r\n    ++_Where; \/\/ save successor iterator for return\r\n\r\n    _Nodeptr _Fixnode; \/\/ the node to recolor as needed\r\n    _Nodeptr _Fixnodeparent; \/\/ parent of _Fixnode (which may be nil)\r\n    _Nodeptr _Pnode = _Erasednode;\r\n\r\n    if (_Pnode-&gt;_Left-&gt;_Isnil) {\r\n        _Fixnode = _Pnode-&gt;_Right; \/\/ stitch up right subtree\r\n    } else if (_Pnode-&gt;_Right-&gt;_Isnil) {\r\n        _Fixnode = _Pnode-&gt;_Left; \/\/ stitch up left subtree\r\n    } else { \/\/ two subtrees, must lift successor node to replace erased\r\n        _Pnode   = _Where._Ptr; \/\/ _Pnode is successor node\r\n        _Fixnode = _Pnode-&gt;_Right; \/\/ _Fixnode is only subtree\r\n    }\r\n\r\n    if (_Pnode == _Erasednode) { \/\/ at most one subtree, relink it\r\n        _Fixnodeparent = _Erasednode-&gt;_Parent;\r\n        if (!_Fixnode-&gt;_Isnil) {\r\n            _Fixnode-&gt;_Parent = _Fixnodeparent; \/\/ link up\r\n        }\r\n\r\n        if (_Myhead-&gt;_Parent == _Erasednode) {\r\n            _Myhead-&gt;_Parent = _Fixnode; \/\/ link down from root\r\n        } else if (_Fixnodeparent-&gt;_Left == _Erasednode) {\r\n            _Fixnodeparent-&gt;_Left = _Fixnode; \/\/ link down to left\r\n        } else {\r\n            _Fixnodeparent-&gt;_Right = _Fixnode; \/\/ link down to right\r\n        }\r\n\r\n        if (_Myhead-&gt;_Left == _Erasednode) {\r\n            _Myhead-&gt;_Left = _Fixnode-&gt;_Isnil ? _Fixnodeparent \/\/ smallest is parent of erased node\r\n                                              : _Min(_Fixnode); \/\/ smallest in relinked subtree\r\n        }\r\n\r\n        if (_Myhead-&gt;_Right == _Erasednode) {\r\n            _Myhead-&gt;_Right = _Fixnode-&gt;_Isnil ? _Fixnodeparent \/\/ largest is parent of erased node\r\n                                               : _Max(_Fixnode); \/\/ largest in relinked subtree\r\n        }\r\n    } else { \/\/ erased has two subtrees, _Pnode is successor to erased\r\n        _Erasednode-&gt;_Left-&gt;_Parent = _Pnode; \/\/ link left up\r\n        _Pnode-&gt;_Left               = _Erasednode-&gt;_Left; \/\/ link successor down\r\n\r\n        if (_Pnode == _Erasednode-&gt;_Right) {\r\n            _Fixnodeparent = _Pnode; \/\/ successor is next to erased\r\n        } else { \/\/ successor further down, link in place of erased\r\n            _Fixnodeparent = _Pnode-&gt;_Parent; \/\/ parent is successor's\r\n            if (!_Fixnode-&gt;_Isnil) {\r\n                _Fixnode-&gt;_Parent = _Fixnodeparent; \/\/ link fix up\r\n            }\r\n\r\n            _Fixnodeparent-&gt;_Left        = _Fixnode; \/\/ link fix down\r\n            _Pnode-&gt;_Right               = _Erasednode-&gt;_Right; \/\/ link next down\r\n            _Erasednode-&gt;_Right-&gt;_Parent = _Pnode; \/\/ right up\r\n        }\r\n\r\n        if (_Myhead-&gt;_Parent == _Erasednode) {\r\n            _Myhead-&gt;_Parent = _Pnode; \/\/ link down from root\r\n        } else if (_Erasednode-&gt;_Parent-&gt;_Left == _Erasednode) {\r\n            _Erasednode-&gt;_Parent-&gt;_Left = _Pnode; \/\/ link down to left\r\n        } else {\r\n            _Erasednode-&gt;_Parent-&gt;_Right = _Pnode; \/\/ link down to right\r\n        }\r\n\r\n        _Pnode-&gt;_Parent = _Erasednode-&gt;_Parent; \/\/ link successor up\r\n        _STD swap(_Pnode-&gt;_Color, _Erasednode-&gt;_Color); \/\/ recolor it\r\n    }\r\n\r\n    if (_Erasednode-&gt;_Color == _Black) { \/\/ erasing black link, must recolor\/rebalance tree\r\n        for (; _Fixnode != _Myhead-&gt;_Parent &amp;&amp; _Fixnode-&gt;_Color == _Black; _Fixnodeparent = _Fixnode-&gt;_Parent) {\r\n            if (_Fixnode == _Fixnodeparent-&gt;_Left) { \/\/ fixup left subtree\r\n                _Pnode = _Fixnodeparent-&gt;_Right;\r\n                if (_Pnode-&gt;_Color == _Red) { \/\/ rotate red up from right subtree\r\n                    _Pnode-&gt;_Color         = _Black;\r\n                    _Fixnodeparent-&gt;_Color = _Red;\r\n                    _Lrotate(_Fixnodeparent);\r\n                    _Pnode = _Fixnodeparent-&gt;_Right;\r\n                }\r\n\r\n                if (_Pnode-&gt;_Isnil) {\r\n                    _Fixnode = _Fixnodeparent; \/\/ shouldn't happen\r\n                } else if (_Pnode-&gt;_Left-&gt;_Color == _Black\r\n                           &amp;&amp; _Pnode-&gt;_Right-&gt;_Color == _Black) { \/\/ redden right subtree with black children\r\n                    _Pnode-&gt;_Color = _Red;\r\n                    _Fixnode       = _Fixnodeparent;\r\n                } else { \/\/ must rearrange right subtree\r\n                    if (_Pnode-&gt;_Right-&gt;_Color == _Black) { \/\/ rotate red up from left sub-subtree\r\n                        _Pnode-&gt;_Left-&gt;_Color = _Black;\r\n                        _Pnode-&gt;_Color        = _Red;\r\n                        _Rrotate(_Pnode);\r\n                        _Pnode = _Fixnodeparent-&gt;_Right;\r\n                    }\r\n\r\n                    _Pnode-&gt;_Color         = _Fixnodeparent-&gt;_Color;\r\n                    _Fixnodeparent-&gt;_Color = _Black;\r\n                    _Pnode-&gt;_Right-&gt;_Color = _Black;\r\n                    _Lrotate(_Fixnodeparent);\r\n                    break; \/\/ tree now recolored\/rebalanced\r\n                }\r\n            } else { \/\/ fixup right subtree\r\n                _Pnode = _Fixnodeparent-&gt;_Left;\r\n                if (_Pnode-&gt;_Color == _Red) { \/\/ rotate red up from left subtree\r\n                    _Pnode-&gt;_Color         = _Black;\r\n                    _Fixnodeparent-&gt;_Color = _Red;\r\n                    _Rrotate(_Fixnodeparent);\r\n                    _Pnode = _Fixnodeparent-&gt;_Left;\r\n                }\r\n\r\n                if (_Pnode-&gt;_Isnil) {\r\n                    _Fixnode = _Fixnodeparent; \/\/ shouldn't happen\r\n                } else if (_Pnode-&gt;_Right-&gt;_Color == _Black\r\n                           &amp;&amp; _Pnode-&gt;_Left-&gt;_Color == _Black) { \/\/ redden left subtree with black children\r\n                    _Pnode-&gt;_Color = _Red;\r\n                    _Fixnode       = _Fixnodeparent;\r\n                } else { \/\/ must rearrange left subtree\r\n                    if (_Pnode-&gt;_Left-&gt;_Color == _Black) { \/\/ rotate red up from right sub-subtree\r\n                        _Pnode-&gt;_Right-&gt;_Color = _Black;\r\n                        _Pnode-&gt;_Color         = _Red;\r\n                        _Lrotate(_Pnode);\r\n                        _Pnode = _Fixnodeparent-&gt;_Left;\r\n                    }\r\n\r\n                    _Pnode-&gt;_Color         = _Fixnodeparent-&gt;_Color;\r\n                    _Fixnodeparent-&gt;_Color = _Black;\r\n                    _Pnode-&gt;_Left-&gt;_Color  = _Black;\r\n                    _Rrotate(_Fixnodeparent);\r\n                    break; \/\/ tree now recolored\/rebalanced\r\n                }\r\n            }\r\n        }\r\n\r\n        _Fixnode-&gt;_Color = _Black; \/\/ stopping node is black\r\n    }\r\n\r\n    if (0 &lt; _Mysize) {\r\n        --_Mysize;\r\n    }\r\n\r\n    return _Erasednode;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>\u63d2\u5165\u5143\u7d20<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">_Nodeptr _Insert_node(const _Tree_id&lt;_Nodeptr&gt; _Loc, const _Nodeptr _Newnode) noexcept {\r\n    ++_Mysize;\r\n    const auto _Head  = _Myhead;\r\n    _Newnode-&gt;_Parent = _Loc._Parent;\r\n    if (_Loc._Parent == _Head) { \/\/ first node in tree, just set head values\r\n        _Head-&gt;_Left     = _Newnode;\r\n        _Head-&gt;_Parent   = _Newnode;\r\n        _Head-&gt;_Right    = _Newnode;\r\n        _Newnode-&gt;_Color = _Black; \/\/ the root is black\r\n        return _Newnode;\r\n    }\r\n\r\n    _STL_INTERNAL_CHECK(_Loc._Child != _Tree_child::_Unused);\r\n    if (_Loc._Child == _Tree_child::_Right) { \/\/ add to right of _Loc._Parent\r\n        _STL_INTERNAL_CHECK(_Loc._Parent-&gt;_Right-&gt;_Isnil);\r\n        _Loc._Parent-&gt;_Right = _Newnode;\r\n        if (_Loc._Parent == _Head-&gt;_Right) { \/\/ remember rightmost node\r\n            _Head-&gt;_Right = _Newnode;\r\n        }\r\n    } else { \/\/ add to left of _Loc._Parent\r\n        _STL_INTERNAL_CHECK(_Loc._Parent-&gt;_Left-&gt;_Isnil);\r\n        _Loc._Parent-&gt;_Left = _Newnode;\r\n        if (_Loc._Parent == _Head-&gt;_Left) { \/\/ remember leftmost node\r\n            _Head-&gt;_Left = _Newnode;\r\n        }\r\n    }\r\n\r\n    for (_Nodeptr _Pnode = _Newnode; _Pnode-&gt;_Parent-&gt;_Color == _Red;) {\r\n        if (_Pnode-&gt;_Parent == _Pnode-&gt;_Parent-&gt;_Parent-&gt;_Left) { \/\/ fixup red-red in left subtree\r\n            const auto _Parent_sibling = _Pnode-&gt;_Parent-&gt;_Parent-&gt;_Right;\r\n            if (_Parent_sibling-&gt;_Color == _Red) { \/\/ parent's sibling has two red children, blacken both\r\n                _Pnode-&gt;_Parent-&gt;_Color          = _Black;\r\n                _Parent_sibling-&gt;_Color          = _Black;\r\n                _Pnode-&gt;_Parent-&gt;_Parent-&gt;_Color = _Red;\r\n                _Pnode                           = _Pnode-&gt;_Parent-&gt;_Parent;\r\n            } else { \/\/ parent's sibling has red and black children\r\n                if (_Pnode == _Pnode-&gt;_Parent-&gt;_Right) { \/\/ rotate right child to left\r\n                    _Pnode = _Pnode-&gt;_Parent;\r\n                    _Lrotate(_Pnode);\r\n                }\r\n\r\n                _Pnode-&gt;_Parent-&gt;_Color          = _Black; \/\/ propagate red up\r\n                _Pnode-&gt;_Parent-&gt;_Parent-&gt;_Color = _Red;\r\n                _Rrotate(_Pnode-&gt;_Parent-&gt;_Parent);\r\n            }\r\n        } else { \/\/ fixup red-red in right subtree\r\n            const auto _Parent_sibling = _Pnode-&gt;_Parent-&gt;_Parent-&gt;_Left;\r\n            if (_Parent_sibling-&gt;_Color == _Red) { \/\/ parent's sibling has two red children, blacken both\r\n                _Pnode-&gt;_Parent-&gt;_Color          = _Black;\r\n                _Parent_sibling-&gt;_Color          = _Black;\r\n                _Pnode-&gt;_Parent-&gt;_Parent-&gt;_Color = _Red;\r\n                _Pnode                           = _Pnode-&gt;_Parent-&gt;_Parent;\r\n            } else { \/\/ parent's sibling has red and black children\r\n                if (_Pnode == _Pnode-&gt;_Parent-&gt;_Left) { \/\/ rotate left child to right\r\n                    _Pnode = _Pnode-&gt;_Parent;\r\n                    _Rrotate(_Pnode);\r\n                }\r\n\r\n                _Pnode-&gt;_Parent-&gt;_Color          = _Black; \/\/ propagate red up\r\n                _Pnode-&gt;_Parent-&gt;_Parent-&gt;_Color = _Red;\r\n                _Lrotate(_Pnode-&gt;_Parent-&gt;_Parent);\r\n            }\r\n        }\r\n    }\r\n\r\n    _Head-&gt;_Parent-&gt;_Color = _Black; \/\/ root is always black\r\n    return _Newnode;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4ee5\u4e0b\u4ee3\u7801\u6765\u81ea\uff1axtree \u5de6\u65cb\uff1a voi<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[119],"class_list":["post-4575","post","type-post","status-publish","format-standard","hentry","tag-03-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=4575"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4575\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=4575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=4575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=4575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}