Онда іздеудің қарапайымдалған процедурасы былай жазылады:
FUNCTION LOC(X: INTEGER; Т: REF): REF;
BEGIN
S^.KEY:=X;
WHILE T^.KEY <>Х DO
IF X < T^KEY THEN Т := T^.LEFT
ELSE Т := T^.RIGHT;
LOC:=T
END;
Егер тамыры Т болатын ағашта Х мәні бар кілт табылмаса, онда бұл
жағдайда LOC(X, Т) S мәнін, яғни бөгетке сілтемені қабылдайды. S-ке
сілтеме өзіне Nil сілтемесінің ролін алады.
Ағашқа жаңа түйін қосу
Ағашқа жаңа түйін қосудың көрнекті мысалы ретінде жиілік сөздігін
құру болып табылады. Бұл жағдайда сөздер тізбегі берілген, әрбір сөздің
кездесу жиілігін табу керек. Бұл әрбір бос ағаштан бастап, әр сөз ағаштан
ізделінетіндігін білдіреді. Егер ол табылса, оның кездесу санағышы бір
көрсеткішке ұлғаяды, табылмаса – осы сөз ағашқа енгізіледі (санағыштың
бастапқы мәні 1-ге тең. Мұны ағаштан қосып іздеу деп атауға болады.
Қарапайымдылық үшін бастапқы мәтіннен сөздер ерекшеленіп, бүтін
сандармен кодталған және енуші файлда орналасқан деп болжаймыз.
Типтер былай сипатталған болсын:
TYPE REF = ^WORD;
WORD = RECORD
KEY: INTEGER;
COUNT: INTEGER;
LEFT, RIGHT: REF
END;
Кілттердің F бастапқы файлы бар деп есептейік, ал ROOT айнымалысы
іздеу ағашының тамырын білдірсін:
RESET (F);
WHILE NOT EOF(F)
DO BEGIN
READ (F, X);
SEARCH (X, ROOT)
END;
Мұнда SEARCH (X, ROOT) – іздеу процедурасы. Оның сипаттамасы:
PROCEDURE SEARCH (X: INTEGER; VAR P: REF);
BEGIN IF P =
Nil THEN BEGIN
NEW(P);
WITH P^
DO BEGIN
KEY :=X; COUNT:=1;
LEFT:=Nil; RIGHT:=Nil
END
END ELSE
IF X < P^.KEY THEN SEARCH(X, P^.LEFT) ELSE
IF X > P^.KEY THEN SEARCH(X, P^.RIGHT) ELSE
P^.COUNT := P^.COUNT +1
END {SEARCH }
P параметрі параметр-мән ретінде емес, параметр-айнымалы ретінде
жіберілетіндігіне назар аударайық. Бұл маңызды, себебі оған сілтеменің жаңа
мәні беріледі.
Осыны есепке ала отырып, сонымен қоса сөздердің кілттері INPUT
файлынан алынады десек, негізгі бағдарламаны былай жазуға болады :
BEGIN
ROOT :=Nil;
WHILE
NOT EOF DO BEGIN
READ (K);
SEARCH (K, ROOT);
END;
PRINTTREE (ROOT, 0)
END.
ROOT және К айнымалылары
VAR ROOT: REF; K: INTEGER; деп сипатталу керек
Салыстыру үшін SEARCH процедурасының версияларын рекурсияның
қолданылуынсыз жасайық. Қосуды жасау үшін өтілген жолды кем дегенде
алдындағы бір қадамды есте сақтау керек. Кезекті қосылатын компонентаны
дұрыс қосу үшін оның арғы аталарына сілтемеміз болу керек және оның
бағыныңқы ағаштардың қайсысы: сол жақ немесе оң жақ болып
қосылатынын білуіміз керек. Ол үшін екі айнымалы енгізіледі: Р2 мен D:
PROCEDURE SEARCH (X: INTEGER; ROOT: REF);
VAR PI, P2: REF; D: INTEGER;
BEGIN P2 := ROOT; PI := P2^.RIGHT; D :=1;
WHILE (PI <> Nil) AND (D <> 0) DO BEGIN
P2:=P1;
IFX
BEGIN P1:=P1^.LEFT; D:=-1
END
ELSE IF X>P1^.KEY THEN
BEGIN P1:=Pl^.RIGHT; D := 1
END
ELSE D := 0
END;
IF D = 0 THEN Pl^.COUNT := Pl^.COUNT + 1
ELSE BEGIN
NEW(Pl);
WITH P1^ DO BEGIN
KEY :=
X; LEFT :=Nil;
RUGHT :=Nil; COUNT := 1
END;