Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 28th, 2012  |  syntax: None  |  size: 1.29 KB  |  hits: 11  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. % балансировка красно-чёрного поддерева
  2. % (объясняется графически)
  3. balance(T,tr(red,B,tr(black,A,T1,T2),tr(black,C,T3,T4))) :-
  4.     T=tr(black,A,T1,tr(red,B,T2,tr(red,C,T3,T4))),!;
  5.     T=tr(black,C,tr(red,B,tr(red,A,T1,T2),T3,T4)),!;
  6.     T=tr(black,A,T1,tr(red,C,tr(red,B,T2,T3),T4)),!;
  7.     T=tr(black,C,tr(red,A,T1,tr(red,B,T2,T3)),T4),!.
  8. balance(T,T).
  9.  
  10. % вставка узла в красно-чёрное дерево
  11. % (не гарантирует черноту корня)
  12. ins(e,X,tr(red,X,e,e)).
  13. ins(tr(C,X,L,R),X,tr(C,X,L,R)).
  14. ins(tr(C,Y,L,R),X,Res) :-
  15.     X<Y,ins(L,X,L1),balance(tr(C,Y,L1,R),Res);
  16.     X>Y,ins(R,X,R1),balance(tr(C,Y,L,R1),Res).
  17.  
  18. % принудительное окрашивание в чёрный цвет
  19. % (не нарушает правил красно-чёрного дерева)
  20. blackenize(tr(_,X,L,R),tr(black,X,L,R)).
  21.  
  22. % добавление узла, состоит из:
  23. % - вставки
  24. % - и окрашивания корня в чёрный цвет
  25. add(T,X,Res) :- ins(T,X,T1),blackenize(T1,Res).
  26.  
  27. % самостоятельное задание:
  28. % - последовательно добавить в пустое дерево элементы от 1 до 1000
  29. % - подсчитать глубину дерева