<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE</id>
	<title>АВЛ-дерево - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE"/>
	<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;action=history"/>
	<updated>2026-05-13T11:38:02Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://acm.khpnets.info/w39/index.php?title=%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=2326&amp;oldid=prev</id>
		<title>Ctrlalt: Новая страница: « class AVLTree {        struct Node {          int key, height;          Node *l, *r;          Node(int key) : key(key), height(1), l(0), r(0) {}      } *root;   …»</title>
		<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=2326&amp;oldid=prev"/>
		<updated>2019-02-06T11:39:58Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: « class AVLTree {        struct Node {          int key, height;          Node *l, *r;          Node(int key) : key(key), height(1), l(0), r(0) {}      } *root;   …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt; class AVLTree {&lt;br /&gt;
 &lt;br /&gt;
     struct Node {&lt;br /&gt;
         int key, height;&lt;br /&gt;
         Node *l, *r;&lt;br /&gt;
         Node(int key) : key(key), height(1), l(0), r(0) {}&lt;br /&gt;
     } *root;&lt;br /&gt;
 &lt;br /&gt;
     int height(const Node *n) const {&lt;br /&gt;
         return n ? n-&amp;gt;height : 0;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void updateHeight(Node *n) {&lt;br /&gt;
         if (n)&lt;br /&gt;
             n-&amp;gt;height = 1 + max(height(n-&amp;gt;l), height(n-&amp;gt;r));&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void simpleRotateLeft(Node *&amp;amp;n) {&lt;br /&gt;
         Node *a = n, *b = a-&amp;gt;r;&lt;br /&gt;
         a-&amp;gt;r = b-&amp;gt;l;&lt;br /&gt;
         b-&amp;gt;l = a;&lt;br /&gt;
         updateHeight(a);&lt;br /&gt;
         updateHeight(b);&lt;br /&gt;
         n = b;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void simpleRotateRight(Node *&amp;amp;n) {&lt;br /&gt;
         Node *a = n, *b = a-&amp;gt;l;&lt;br /&gt;
         a-&amp;gt;l = b-&amp;gt;r;&lt;br /&gt;
         b-&amp;gt;r = a;&lt;br /&gt;
         updateHeight(a);&lt;br /&gt;
         updateHeight(b);&lt;br /&gt;
         n = b;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void doubleRotateLeft(Node *&amp;amp;n) {&lt;br /&gt;
         simpleRotateRight(n-&amp;gt;r);&lt;br /&gt;
         simpleRotateLeft(n);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void doubleRotateRight(Node *&amp;amp;n) {&lt;br /&gt;
         simpleRotateLeft(n-&amp;gt;l);&lt;br /&gt;
         simpleRotateRight(n);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void rebalance(Node *&amp;amp;n) {&lt;br /&gt;
         if (!n)&lt;br /&gt;
             return;&lt;br /&gt;
         if (height(n-&amp;gt;l) - height(n-&amp;gt;r) == -2) {&lt;br /&gt;
             if (n-&amp;gt;r &amp;amp;&amp;amp; height(n-&amp;gt;r-&amp;gt;l) - height(n-&amp;gt;r-&amp;gt;r) == +1)&lt;br /&gt;
                 doubleRotateLeft(n);&lt;br /&gt;
             else&lt;br /&gt;
                 simpleRotateLeft(n);&lt;br /&gt;
         } &lt;br /&gt;
         if (height(n-&amp;gt;l) - height(n-&amp;gt;r) == +2) {&lt;br /&gt;
             if (n-&amp;gt;l &amp;amp;&amp;amp; height(n-&amp;gt;l-&amp;gt;l) - height(n-&amp;gt;l-&amp;gt;r) == -1)&lt;br /&gt;
                 doubleRotateRight(n);&lt;br /&gt;
             else&lt;br /&gt;
                 simpleRotateRight(n);&lt;br /&gt;
         }&lt;br /&gt;
         updateHeight(n);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void insert(Node *&amp;amp;n, int key) {&lt;br /&gt;
         if (!n)&lt;br /&gt;
             n = new Node(key);&lt;br /&gt;
         else&lt;br /&gt;
             insert(key &amp;lt; n-&amp;gt;key ? n-&amp;gt;l : n-&amp;gt;r, key);&lt;br /&gt;
         rebalance(n);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void erase(Node *&amp;amp;n, int key) {&lt;br /&gt;
         if (!n)&lt;br /&gt;
             return;&lt;br /&gt;
         if (n-&amp;gt;key == key) {&lt;br /&gt;
             if (!n-&amp;gt;l || !n-&amp;gt;r) {&lt;br /&gt;
                 Node *child = (n-&amp;gt;l ? n-&amp;gt;l : n-&amp;gt;r);&lt;br /&gt;
                 delete n;&lt;br /&gt;
                 n = child;&lt;br /&gt;
             } else {&lt;br /&gt;
                 Node *successor = n-&amp;gt;r;&lt;br /&gt;
                 while (successor-&amp;gt;l)&lt;br /&gt;
                     successor = successor-&amp;gt;l;&lt;br /&gt;
                 n-&amp;gt;key = successor-&amp;gt;key;&lt;br /&gt;
                 erase(n-&amp;gt;r, successor-&amp;gt;key);&lt;br /&gt;
             }&lt;br /&gt;
         } else&lt;br /&gt;
             erase(key &amp;lt; n-&amp;gt;key ? n-&amp;gt;l : n-&amp;gt;r, key);&lt;br /&gt;
         rebalance(n);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 public:&lt;br /&gt;
 &lt;br /&gt;
     AVLTree() : root(0) {}&lt;br /&gt;
 &lt;br /&gt;
     int height() const {&lt;br /&gt;
         return height(root);&lt;br /&gt;
     }&lt;br /&gt;
    &lt;br /&gt;
     void insert(int key) {&lt;br /&gt;
         insert(root, key);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void erase(int key) {&lt;br /&gt;
         erase(root, key);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
[[Category:Балансирующиеся деревья]]&lt;/div&gt;</summary>
		<author><name>Ctrlalt</name></author>
	</entry>
</feed>