для проверки того, является ли



Упражнение

10. 3. Определите отношение
        avl( Дер)
для проверки того, является ли Дер AVL-деревом, т.е. верно ли, что любые два его поддерева, подсоединенные к одной и той же вершине, отличаются по глубине не более чем на 1. Двоичные
line(); %  Вставление элемента в AVL-справочник
        доб_аvl( nil/0, X, д( nil/0, X, nil/0)/1).
                                    % Добавить Х к пустому дереву
        доб_аvl( д( L, Y, R)/Ну, X, НовДер) :-
                                    % Добавить Х к непустому дереву
                больше( Y, X),
                доб_аvl( L, X, д( L1, Z, L2)/ _ ),
                                    % Добавить к левому поддереву
                соединить( L1, Z, L2, Y, R, НовДер).
                                    % Сформировать новое дерево


        доб_avl( д( L, Y, R)/Ну, X, НовДер) :-
                больше( X, Y),
                доб_avl( R, X, д( R1, Z, R2)/ _ ),
                                    % Добавить к правому поддереву
                соединить( L1, Y, Rl, Z, R2, НовДер).
        соединить( Д1/Н1, А, д( Д21, В, Д22)/Н2, С, Д3/Н3,
                д( д( Д1/Н1, А, Д21)/На, В, д( Д22, С, L3/Н3)/Нс)/Нb) :-
                Н2 > H1, H2 > Н3,                 % Среднее дерево глубже остальных
                На is H1 + 1,
                Hс is Н3 + 1,
                Нb is На + 1.
        соединить( Д1/Н1, А, д( Д2/Н2, С, Д3/Н3,
                д( Д1/Н1, А, д( Д2/Н2, С, Д3/Н3)/Нс)/На) :-
                H1 >= H2, H1 >= Н3,            % "Глубокое" левое дерево
                max1( H2, Н3, Нс),
                max1( H1, Нс, На).
        соединить( Д1/Н1, А, Д2/Н2, С, Д3/Н3,
                д( д( Д1/Н1, А, Д2/Н2)/На, С, Д3/Н3)/Нс) :-
                Н3 >= H2, Н3 >= H1,            % "Глубокое" правое дерево
                max1( H1, H2, На),
                max1( На, Н3, Нс).
        max1( U, V, М) :-
                U > V,  !,  М is U + 1;            % М равно 1 плюс max( U,V)
                М is V + 1.
line();



Содержание раздела