вторник, 27 декабря 2011 г.

Очередной виток безумия


1) Не так давно были перехвачины разговоры Бори, который открыто заявил, что все пришедшие:

а) Овощи, хомячки и боязливые пингвины
б) Пушечное мясо (или как то так)

При этом народу пришло больше чем на болотную, т.е. все согласны, что они овощи и боязливые пингвины.
2) Программы, отвечающей на вопросы, а что же дальше и кто же вместо до сих пор нет.
3) Уже сейчас активно вдалбливается в головы "молодых горячих организмов" (школоты), что какими бы ни были результаты выборов, они всё равно сфальсифицированы.
4) Предлагается в следующий раз приходить и уже не расходиться. Что есть вполне себе оранжевый сценарий.

Мне, например, тут вторая Украина нахуй не нужна. Я не много встречал украинцев, которые были впоследствии счастливы и не жалели о своём участии в оранжевом безумии.

вторник, 29 ноября 2011 г.

Их борьба

Сегодня на дороге встретил реального борца с режимом. С наклейкой на заднем стекле про партию жуликов и воров. При всей моей безграничной ненависти к партии жуликов и воров, все таки было бы неплохо, если бы борцы вначале научились соблюдать правила дорожного движения. 


На картинке хорошо видно наклейку и отлично видно, что борец с режимом прет по полосе, выделенной для общественного транспорта. Борец проскочит и будет далеко впереди меня, когда решит уйти с полосы влево,  чтобы не попасться гаишнику. И мой ряд из за него притормозит. Т.к. подобных "борцов" просто тысячи по Москве, то мой ряд практически все время стоит, т.к. бороцца с гаишниками борцам не очень хочется. Одно дело налейки клеить, а другое - пообщаться с сотрудником ДПС, подождать пока он штраф выпишет и потом пойти заплатить.  
Получается, что мне приходится стоять в пробке, в то время как хитрожопые борцы с жуликами и ворами проскакивают по полосе, которая выделена для общественного транспорта. Потому что им надо куда то очень срочно. По мне так пусть уж учше один депутат проедет по полосе и потом там будет свободно, чем тысячи "борцов" из за которых шоссе встанет наглухо. Самое обидное, что потом эти припиздыши громче всех будут визжать про "катастрофическую ситуацию на дорогах столицы" вотдочегопутинстранудовел. 

пятница, 18 ноября 2011 г.

Не знаешь с чего начать? Начни с плана! :)

В очередной раз убедился, что если дел так много, что непонятно с чего начинать, то начинать надо с плана. Иначе дело так и будет стоять на месте. Будешь метаться из одного угла, в другой. Браться то за одну задачу, то за другую. При этом дело как стояло так и будет стоять на месте.
План полезен, потому что во первых, позволяет расставить приоритеты, во вторых показывает длительность задач, входящих в этот план. Вобщем, планирование порой не только вредно, но и полезно.
Ваш КО :).

воскресенье, 6 ноября 2011 г.

Несуществующий повод для гордости

Когда я только-только бросил курить, я очень гордился этим фактом. Я и сейчас рассматриваю это как важное жизненное достижение. Проблема в том, что никакого повода для гордости здесь нет и быть не может. В действительности, я сам создал себе проблему, затем решил ее, а теперь горжусь этим решением. Получается весьма глупо :).

Гордиться надо тем людям, которые не начинали даже попробовав. Вот это реальное достижение. 

пятница, 14 октября 2011 г.

... Моим гнусным учителям ...

Девушка описала ужасы советской школы.

Многие на неё накинулись сразу... материть начали. Я, конечно, в такой замес не попадал, да и школа моя была постперестроечная в основном (1988-1998). Но пару эпизодов из своей школьной жизни я, скорее всего, буду помнить всегда...

1993 год. Я учился в обычной "заводской" средней школе, где учился почти весь наш район. С  товарищами в школе отношения у всех были нормальные, особо никого не гнобили, хотя публика там та ещё подобралась... Тем не менее, в связи с перестройкой, учительский состав оставлял желать лучшего, да и репутация школы в городе была весьма дурная (там был в то время недобор, поэтому брали  всех кто просился, в том числе и тех кого выгнали после 9-го класса из других школ). Поэтому я принял решение уйти в другую школу с физико-математическим уклоном. Решение было весьма идиотским, потому что я и в своей то школе знаниями не блистал (я просто ничего не делал :) ). Так лавировал как то между тройками, четверками и пятерками.
Каким то образом я прошел тесты и меня приняли в лицейный класс новой школы.
Далее начался реальный ад.

Такого количества (и качества!!!) неадеквата как в лицейной школе, я не видел даже среди временами пьющих и приходящих на уроки в нетрезвом виде учителей из своей старой школы.

Совершенно съехавшие с катушек, с непомерным чувством собственной важности "лицейные"  учителя считали себя "элитой", по городу про них гремела слава "лучших педагогов" республики... Собственно ученики из лицейных классов тоже очень быстро себя возомнили себя "лучшими умами города" и вели себя соответственно.  

Мне там было было реально тяжело, потому, что я не тянул. И как то так получилось, что я не нашел единомышленников среди учеников, и среди учителей пользовался весьма "дурной" :) репутацией. Я ненавидел их, а они меня. Особенно мне запомнилась класснуха, которая была реально шизанутая, но как и многие неадекваты в этой школе считалась "сильным учителем и образцовым педагогом". Пару раз за время моего обучения она ломала руки-ноги и по три месяца сидела дома. Для меня это было золотое время :). Последний раз я слышал про неё года четыре назад. Я слышал, что в школе она больше не работает и что у неё рак и я  специально никого не спрашивал с тех пор чем это закончилось.После двух лет "обучения" я был успешно выкинут из лицейного класса и попал в класс обычный, где и математического уклона нет и учителя нормальные (не "образцовые лучшие в мире тр...пр.. педагоги"). Там уже было получше и ничего плохого про этот период я сказать не могу.  У нас была отличная классная руководительница, которую я и сейчас не редко вспоминаю, у нас были нормальные учителя (за редким исключением) и ещё я начал активное участие  в художественной самодеятельности :). Народ в классе был интересный и совсем-совсем недушный :))).

Единственно что мне интересно: где сейчас эти прекрасные ученики лицейных классов? Где эти люди, которым пророчили грандиозные успехи в жизни? Где все эти будущие "нобелевские лауреаты"? Почему о них ничего не слышно? Впрочем речь не них сейчас. 

Изначально речь была об учителях и о посте, посвященном учителям. Я не готов подписаться под каждым словом из того поста, но одно могу сказать точно: написанное не является вымыслом. Всё описанное в посте действительно имеется в нашей жизни. Есть люди, которым положено работать вахтером, ну или на рынке или ещё где нибудь "там". Но каким то нелепым образом они попадают в школы на должность учителей. И ещё более нелепым образом из мерзкого быдла превращаются в "заслуженных педагогов".

четверг, 23 июня 2011 г.

Очередная отличная идея от Google

Идея заключается в частичном отказе от "continious integration" и в том, что бы запускать тесты немедленно после изменения модуля. Но запускать не все тесты, а только те, которые к этому модулю относятся.
На схеме приведен пример, демонстрирующий процесс (кликабельно):


Более подробно в оригинальной статье (англ.) в блоге Google Testing.

среда, 22 июня 2011 г.

Data structures: Queue

Простая очередь - структура данных имеющая набор элементов и поддерживающая методы Поставить в очередь и Удалить из очереди. Название структуры говорит само за себя: элементы вносятся в набор и удаляются из него в порядке очереди (т.е. FIFO). Данный код демонстрирует две реализации очереди: на базе массива и на базе связного списка.

Data structures: Linked list

Совсем краткое описание. 
Связный список - структура данных, имеющая набор своих данных и содержащая ссылку на следующий элемент  (или две ссылки: одна на следующий, одна на предыдущие). В случае, если  
в списке ссылка только на следующий элемент, то список называется однонаправленным. Если на следующий и предыдущий, то двунаправленным.   

вторник, 21 июня 2011 г.

Data structures: Stack

Стек - структура данных имеющая набор элементов и поддерживающая методы Затолкнуть и Извлечь. Элементы вносятся в набор и удаляются из него в следующие порядке: в первую очередь обрабатывается элемент поступивший последним  (т.е. LIFO).

Серия статей "How Google Tests Software" (продолжение)

Data structures: Hash Table

Хэш-таблица - один из вариантов ассоциативного массива.


Работает достаточно просто: по значению ключа рассчитывается хэш-код. Хэш-код в данном случае является индексом массива. Таким образом в идеале доступ к значению занимает время, равное O(1). В идеале, потому что редко бывает так, чтобы одному хэш-коду соответствовал один ключ. И в "реальной жизни" доступ занимает время равное O(k), где k - количество ключей соответствующих одному хэш-коду.

Data structures: Priority Queue (based on Binary Heap)

#ifndef PRIORITY_QUEUE 
#define PRIORITY_QUEUE 

template<typename ItemType>

struct binary_heap
{
    public: 

        ItemType *heap; 
        int index; 
    
        binary_heap(int heap_size)
        {
            index=0;
            heap=new ItemType[heap_size];         
        };

        void add_item(ItemType new_item)
        {
            index++;

            heap[index]=new_item; 
            bubble_up(index);
        }; 

        ItemType get_min()
        {
            ItemType min=heap[1];
            heap[1]=heap[index];
            
            index=index-1; 
            
            bubble_down(1);
            
            return min; 
        };

    private: 
    
        void bubble_up(int n)
        {
            if (get_parent(n)!=-1)
            {
                if (heap[n]<heap[get_parent(n)]) 
                {
                    ItemType tmp=heap[n]; 
                    heap[n]=heap[get_parent(n)];
                    heap[get_parent(n)]=tmp; 
                
                    bubble_up(get_parent(n));
                }; 
            };
        }; 

        void bubble_down(int n)
        {
                int first_child=get_first_child(n); 
                
                int min_child_index=n; 

                for (int i=0; i<=1; i++)
                {
                    if ((first_child+i)<=index) 
                    {
                        if (heap[min_child_index]>heap[first_child+i]) min_child_index=first_child+i; 
                    }; 
                };

                if (min_child_index!=n)
                {
                    ItemType tmp=heap[min_child_index]; 
                    heap[min_child_index]=heap[n];
                    heap[n]=tmp; 

                    bubble_down(min_child_index);
                };
        };

        int get_parent(int n)
        {
            if (n==1) return -1; 

            return (int)(n/2); 
        }; 

        int get_first_child(int n)
        {
                return (n*2); 
        }; 
};

template <typename ItemType> 

struct priority_queue
{
    public:
        
        binary_heap<ItemType> *pq; 
        int ITEMS_COUNT; 
     
        priority_queue(int items_num)
        {
            pq=new binary_heap<ItemType>(items_num);         
            ITEMS_COUNT=pq->index;
        };

        void push(ItemType new_item)
        {
            pq->add_item(new_item); 
        };

        ItemType pop()
        {
            return pq->get_min();
        };
};

пятница, 27 мая 2011 г.

ГИБДД

За последние годы полномочия сотрудников ГИБДД были настолько урезаны, что ездить можно совершенно не соблюдая правил. Любое нарушение, если оно явно не зафиксировано на камеру, может быть оспорено в суде. Да и если зафиксировано, то оспаривается достаточно легко. Стало сложно оспорить только превышение скорости, зафиксированное стационарной камерой. Тоже можно, но это тот случай, когда заслуженный штраф заплатить дешевле , проще и быстрее, чем доказывать свою "невиновность".
Я часто смотрю ролики а-ля "разговор с сотрудником ИДПС", записанные на видеорегистраторы автовладельцев. Было бы глупо преуменьшать роль регистраторов в процессе общения с сотрудниками ГИБДД, но порой кажется что водилы специально начинают "играть" на камеру, пытаясь показать свою "круть". Например ситуация: Машину останавливают сотрудники ГИБДД (не на посту), просят предъявить документы. Водитель интересуется, а что собственно произошло, почему его остановили и получив ответ о проводимой спецоперации начинает звонить в дежурную часть. Выяснив, что операция действительно проводится, водитель предоставляет документы, получает их обратно и едет дальше. При этом время, затрачиваемое на весь процесс общения, занимает 15 минут. То же самое можно было бы сделать за 3 минуты, попросив сотрудника предъявить удостоверение. На мой взгляд вполне достаточно и время экономит.
С другой стороны, на Ютубе есть много роликов где инспекторы откровенно пытаются "развести на бабки" угрожая административными мерами. Поняв, что жестко обламываются начинают вызывать к совести, морали и "человеческим" понятиям. Как я уже написал в самом начале, с введением жестких ограничений на их полномочия жить им стало весьма нелегко. Просто выходить на дорогу и собирать деньги теперь весьма проблематично.
Таким образом, откровенный беспредел и взяточничество удалось остановить. Но что теперь делать с теми, кто действительно нарушает? Ведь они точно также пользуются своими правами. И очень тяжело будет доказать, что человек пересек две сплошные, если он упорно это отрицает. В итоге имеем другую крайность. Опять же, насколько я знаю, возможность откупится от нарушения всё ещё осталось. К примеру, те же две сплошных будут "стоить" в Москве 20000 рублей.
Получается какой-то замкнутый круг. Дать полномочия - начнут тупо собирать деньги, отобрать все полномочия - ПДД будут соблюдаться только совестливыми людьми что, в свою очередь, приведет к катастрофической ситуации на дорогах.
По моему всё же надо решать кадровый вопрос. Поступить по примеру г-на Саакашвилли: разогнать всех старых, набрать новых на более солидные зарплаты и, одновременно с этим, усилить наказания за взятки. Единственное о чем (почему то) не подумали в Грузии, так это о том что теперь у дорожных полицейских нет никакого интереса к работе. Нет палочной системы, деньги платят в любом случае, поэтому сиди и отдыхай. Сидят и отдыхают. На дорогах у них при этом творится какой то ад.

В общем, подводя итоги, можно сделать следующий вывод: у полиции нельзя отнимать полномочия. Полицейский отличается о гражданского в том числе и тем, что у него есть полномочия. Но у него во первых, должна быть обеспеченная жизнь, во вторых мотивация к работе.

пятница, 22 апреля 2011 г.

"Переобуться" в прошлые выходные не получилось

Колеса с летней резиной хранятся на даче. В прошлое воскресенье к даче я не смог подъехать ближе чем за 300 метров. Таскать колеса на горку (где я оставил машину) я не стал, потому что во первых тяжело их нести в гору по снегу, во вторых их там физически негде менять. Даже там где я оставил машину снега было почти по брюхо.
Так что в то время, когда в Мытищах асфальт и зеленеет травка, в деревне, в Сергиево-Посадском районе:

 
  Теоретически можно было попробовать проехать, но была вероятность что придется там оставаться ночевать, чего мне в воскресный вечер очень не хотелось :)
Правда несколько внедорожников там, говорят, проезжали. Что же, в следующее воскресенье, послезавтра то есть, будет дубль два.

среда, 13 апреля 2011 г.

суббота, 26 марта 2011 г.

Последние просмотренные фильмы

Не так давно появилось свободное время по вечерам. Смотрю фильмы, которые давно хотел посмотреть :)

2012 
Фильм-катастрофа. Снят отлично, со множеством спецэффектов. 




Краткое содержание: наступает конец света. Всё остальное нужно смотреть. В целом очень понравилось, рекомендую.

Король говорит! (The King's Speech)
Не совсем, правда, понятно зачем так перевели, ведь правильней и эффектней было бы перевести "Речь короля". Это был единственный момент, связанный с этим фильмом, который мне не понравился :).


Если кратко, то в фильме рассказывается о заикающемся парне, который стал королём Англии (хотя и не хотел им становиться) в нелегкое время (вторая мировая война). Парень учится говорить, так как ему теперь надо выступать с обращением к народу.

Зелёный шершень

Комедийный боевичок, нечто между бэтменом и чёрным плащом :)


Забавно было посмотреть, но фильм, ИМХО, на один раз.

Убойные каникулы

Это российский постер. Оригинальный приводить здесь не хочется, если кому то всё ж интересно, то вот он.


Не досмотрел до конца. Вроде как комедия, но при таком количестве крови и мяса смеяться не очень хочется. Вообщем я досмотрел до середины и выключил.

Сердца трёх

Древний фильм, 1992 года. Странно, что я не видел его раньше.


Приключения, по мотивам повести Джека Лондона. Некоторые моменты почему то напоминают фрагменты из старых добрых советских сказок :).

суббота, 12 марта 2011 г.

Техосмотр в Мытищах

Сегодня проходил очередной плановый техосмотр. "Честно" проходил первый раз, предыдущие покупал. Но в этом году наших доблестных "дорожных полицейских" так прижали, что сделать ТО за деньги стало очень сложно. Откровенный левак покупать не хотелось, ибо могут остановить и проверить валидность.

Я долго рылся в инете пытаясь понять где же и как его надо проходить "честно". Выяснилось, что в Пушкино (где зарегистрирована машина) ехать необязательно и пройти можно у нас в Мытищах. Как я понял, сейчас можно пройти ТО в любом городе Московской области, если автомобиль зарегистрирован в Московской области (раньше - только по месту регистрации). Сначала я решил поехать в мытищинское ГИБДД, там всё оплатить, взять заявление (сосед сказал что надо) и потом уже ехать на СТО (она в 300 метрах от здания ГИБДД). Так вот, ехать туда не надо (прибить бы соседа!), а нужно ехать стразу на СТО, там же всё можно оплатить. Потом нужно подойти к окошку и сдать документы с квитанциями. Список документов обычный: техпаспорт (не ПТС, а карточка), права, полис ОСАГО и (доверенность и паспорт если машина по доверенности). Я потащился сначала в ГИБДД поэтому потерял тонну времени. Проблема ещё и в том, что не все знают где находится СТО. По адресу указанному на сайте ГИБДД "Олимпийский пр-т, 44",  Гугл и Яндекс никаких зданий на карте не находят. Поэтому я приведу схему проезда (кликабельна):




















 



  
Первый раз, после заезда в гараж, меня отправили в окошко регистрации. Второй раз, когда я наконец оформил всё правильно, у меня в машине наши несколько "изменений, не входящих в конструкцию" (это передняя стяжка стоек и домики). Скрутить всё это я сумел за полчаса и вернулся на третий заход. Станция работает с 9.00 до 20.00, поэтому я успел всё пройти, но талон не выдали, т.к. "база зависла".

Вообщем, всё это можно сделать достаточно быстро. К примеру, народ на иномарках проходил вообще без проблем. Да и ко мне не особо придирались, несмотря на то что машинка у меня далеко не новая (2004-го года).

Ну и напоследок несколько советов, чтобы облегчить прохождение:

1. Обед там с 13.00 до 14.00, лучше приезжать или сильно до обеда (часам к 10.00) или уже после.
2. Необходимо иметь аптечку, огнетушитель и знак аварийной остановки (сейчас какие-то новые требования к этому знаку, мне сказали, что к следующему разу надо будет поменять).
3. Двигатель и всё что вокруг лучше отмыть на мойке. По крайней мере нужно, чтобы номер двигателя и VIN было видно.  
4. Если резина шипованная, то на заднем стекле должен быть знак "Ш".

Пожалуй всё. Что касается меня, то я теперь всегда буду проходить сам и честно, потому что во первых, это просто дешевле, а во вторых это не так сложно. Слухи о трудностях при прохождении техосмотра сильно преувеличены.       

среда, 16 февраля 2011 г.

Data structures: Binary search tree (AVL-tree)

#ifndef AVL_TREE #define AVL_TREE int const UNBALANCED_LEFT=-1; int const UNBALANCED_RIGHT=1; int const BALANCED=0; template<class ItemType> typedef struct avl_tree {    ItemType Item;    avl_tree *rightChild;    avl_tree *leftChild;    int balance_factor; // recreate to enumerator    avl_tree()    {        rightChild=NULL;        leftChild=NULL;        balance_factor=BALANCED;    }; } *avl_tree_node; void single_right_rotation(avl_tree_node &current_tree) {    avl_tree_node lc;           lc=current_tree->leftChild;        lc->balance_factor=BALANCED;    current_tree->balance_factor=BALANCED;    current_tree->leftChild=lc->rightChild;    lc->rightChild=current_tree;        current_tree=lc; };    void double_right_rotation(avl_tree_node &current_tree) {   avl_tree_node lc;   avl_tree_node rg;       lc=current_tree->leftChild;   rg=lc->rightChild;       if (rg->balance_factor==UNBALANCED_RIGHT)   {      current_tree->balance_factor = BALANCED;      lc->balance_factor=UNBALANCED_LEFT;   }   else if (rg->balance_factor==BALANCED)   {      current_tree->balance_factor=BALANCED;        lc->balance_factor=BALANCED;   }   else   {      current_tree->balance_factor=UNBALANCED_RIGHT;        lc->balance_factor=BALANCED;   }   rg->balance_factor=BALANCED;      lc->rightChild=rg->leftChild;   rg->leftChild=lc;   current_tree->leftChild=rg->rightChild;   rg->rightChild=current_tree;   current_tree=rg; }; void single_left_rotation(avl_tree_node &current_tree) {    avl_tree_node rc=current_tree->rightChild;    rc->balance_factor=BALANCED;    current_tree->balance_factor=BALANCED;    current_tree->rightChild=rc->leftChild;    rc->leftChild=current_tree;    current_tree=rc; }; void double_left_rotation(avl_tree_node &current_tree) {    avl_tree_node rc;    avl_tree_node lg;    rc=current_tree->rightChild;    lg=rc->leftChild;    if (lg->balance_factor==UNBALANCED_LEFT)    {        current_tree->balance_factor=BALANCED;        rc->balance_factor=UNBALANCED_RIGHT;    }    else if (lg->balance_factor==BALANCED)    {        current_tree->balance_factor=BALANCED;        rc->balance_factor=BALANCED;    }    else    {        current_tree->balance_factor=UNBALANCED_LEFT;        rc->balance_factor=BALANCED;    };    lg->balance_factor=BALANCED;    current_tree->rightChild=lg->leftChild;    rc->leftChild=lg->rightChild;    lg->leftChild=current_tree;    lg->rightChild=rc;    current_tree=lg; }; void left_tree_update(avl_tree_node &current_tree, bool &review_flag) {    avl_tree_node lc;    lc=current_tree->leftChild;    if (lc->balance_factor==UNBALANCED_LEFT)    {        single_right_rotation(current_tree);        review_flag=false;    }    else if (lc->balance_factor==UNBALANCED_RIGHT)    {        double_right_rotation(current_tree);        review_flag=false;    }; }; void right_tree_update(avl_tree_node &current_tree, bool &review_flag) {    avl_tree_node rc;    rc=current_tree->rightChild;    if (rc->balance_factor==UNBALANCED_RIGHT)    {        single_left_rotation(current_tree);        review_flag=false;    }    else if (rc->balance_factor==UNBALANCED_LEFT)    {        double_left_rotation(current_tree);        review_flag=false;    }; };  void insert_node(avl_tree_node &current_tree, int newValue,  bool &balance_review_flag) {    bool need_balance_review;    if(current_tree == NULL)        {            current_tree = new avl_tree();            current_tree->Item=newValue;                                balance_review_flag=true;            return;        }        else        {            if (newValue < current_tree->Item)            {                insert_node(current_tree->leftChild, newValue,  need_balance_review);                if (need_balance_review)                {                    if(current_tree->balance_factor==UNBALANCED_LEFT)                    {                     left_tree_update(current_tree, balance_review_flag);                    }                    else if (current_tree->balance_factor==BALANCED)                    {                     current_tree->balance_factor=UNBALANCED_LEFT;                     need_balance_review=true;                    }                    else                    {                     current_tree->balance_factor=BALANCED;                     need_balance_review=false;                    };                }                else                {                    balance_review_flag=false;                };            }            else            {                insert_node(current_tree->rightChild, newValue,  need_balance_review);                                if (need_balance_review)                {                    if(current_tree->balance_factor==UNBALANCED_RIGHT)                    {                      right_tree_update(current_tree,  balance_review_flag);                    }                    else if (current_tree->balance_factor==BALANCED)                    {                        current_tree->balance_factor=UNBALANCED_RIGHT;                        need_balance_review=false;                    }                    else                    {                        current_tree->balance_factor=BALANCED;                        need_balance_review=false;                    };                }                else                {                    balance_review_flag=false;                };            };        }; };  void add_node(avl_tree_node &current_tree, int newValue) {    bool review_flag=false;    insert_node(current_tree, newValue, review_flag); }; void traverse_avl_tree(avl_tree_node current_tree) {    if (current_tree!=NULL)    {        traverse_avl_tree(current_tree->leftChild);        std::cout << current_tree->Item << std::endl;        traverse_avl_tree(current_tree->rightChild);    }; };  avl_tree_node node_by_value(avl_tree_node &current_tree, ItemType key) {    if (current_tree==NULL) return(NULL);    if (current_tree->Item==key)        {            return current_tree;                     };        if(key < current_tree->Item)        {            node_by_value(current_tree->leftChild, key);        }        else        {            node_by_value(current_tree->rightChild, key);        }; };  avl_tree_node get_min(avl_tree_node current_tree) // Find minimum in tree {    avl_tree_node min = current_tree;      if (min==NULL) return (NULL);        while (min->leftChild!=NULL)    {        min=min->leftChild;    };        return min; }; avl_tree_node get_parent(avl_tree_node current_tree, avl_tree_node key_node) {    if (current_tree==NULL) return (NULL);        if ( ((current_tree->leftChild!=NULL) && (current_tree->leftChild->Item==key_node->Item) ) || ((current_tree->rightChild!=NULL) && (current_tree->rightChild->Item==key_node->Item)) ) return current_tree;            if (key_node->Item < current_tree->Item)    {        get_parent(current_tree->leftChild, key_node);         }    else    {        get_parent(current_tree->rightChild, key_node);    } }; void delete_node(avl_tree_node &current_tree, int del_value) {    avl_tree_node deleted_node;    deleted_node=node_by_value(current_tree,del_value);    if (deleted_node==NULL) return;
    // Case 1: Deleted node has two child
   if ( (deleted_node->leftChild && deleted_node->rightChild)!=NULL)               {        avl_tree_node min_node;        avl_tree_node parent;        min_node=get_min(deleted_node->rightChild);                deleted_node->Item=min_node->Item;  
        // if minimal left node has a right child
          if (min_node->rightChild!=NULL)                                              {            min_node->Item=min_node->rightChild->Item;            min_node->balance_factor=BALANCED;            min_node->rightChild=NULL;        }        else        {            parent=get_parent(current_tree, get_min(deleted_node->rightChild));            parent->leftChild=NULL;            if (parent->balance_factor==BALANCED)            {                parent->balance_factor=UNBALANCED_RIGHT;            }              else            {                parent->balance_factor=BALANCED;            };                    };    }
    // Case 2: Deleted node has only one child
       else if ((deleted_node->leftChild || deleted_node->rightChild)!=NULL)       {        if (deleted_node->leftChild!=NULL)        {            deleted_node->Item=deleted_node->leftChild->Item;            deleted_node->leftChild=NULL;        }        else        {            deleted_node->Item=deleted_node->rightChild->Item;            deleted_node->rightChild=NULL;        }    }
    // Case 3: Deleted node has no children   

    else if ((deleted_node->leftChild || deleted_node->rightChild)==NULL)      
   {        if (get_parent(current_tree, deleted_node)->leftChild==deleted_node)        {            get_parent(current_tree, deleted_node)->leftChild=NULL;        }        else        {            get_parent(current_tree, deleted_node)->rightChild=NULL;        };    }; }; int get_balance_factor(avl_tree_node current_tree) {    return current_tree->balance_factor; }; #endif

Санкт-Петербург, июль 2021

Фактически был один день, поэтому публикую все так как есть, по порядку. Типичные виды Невы не выкладываю - приелось уже.  1. На следующий д...