Како направити бинарно стабло у Ц

Структурирајте своје бинарно стабло. Сваком бинарном стаблу ће бити потребна структура, чак и ако има само једну променљиву. Изаберите име, а затим користите типедеф да га креирате: типедеф струцт студент_дата СТУДЕНТ_ДАТА;

Дефинишите структуру. Укључите два показивача на исту структуру: струцт студент_дата { инт студент_ИД; инт студент_граде; СТУДЕНТ_ДАТА лево, јел тако;};

Доделите показивач на ову структуру података, иницијализујући је на НУЛЛ, да буде глава стабла: СТУДЕНТ_ДАТА *студентс = НУЛЛ;

Доделите два привремена показивача на структуру података: СТУДЕНТ_ДАТА Нови студент, цур_студент;

Користите маллоц() за креирање новог елемента, увек проверавајући грешку: иф ((нев_студент = маллоц (сизеоф (СТУДЕНТ_ДАТА))) == НУЛЛ) { аборт(); }

Попуните поља новог елемента. Поставите његова лева и десна поља на НУЛЛ: нев_студент->студент_ИД = невИД; нев_студент->студент_сизе = невсизе; нови_студент->лево = НУЛЛ; нови_студент->десно = НУЛЛ;

Узмите у обзир променљиву главе. Ако је променљива хеад НУЛЛ, ово је први елемент који је додат стаблу, па поставите променљиву главе да показује на њу и готови сте: иф (!студентс) { студентс = нев_студент; повратак; }

Руковати дуплираним уносом ако су нова вредност и тренутна вредност једнаке: иф (невИД == цур_студент->студент_ИД) { аборт(); }

Бавите се неједнаким вредностима. Ако је нова вредност мања од тренутне вредности, нови елемент иде лево. Додајте га одмах ако нема ништа са леве стране. У супротном, пређите налево и закрените петљу: иф (невИД < цур_студент->студент_ИД) { иф (цур_студент->лефт == НУЛЛ) { цур_студент->лефт = невстудент; ретурн 1; } цур_студент = цур_студент->лефт;

Урадите исту ствар са десне стране, иначе: } елсе { иф (цур_студент->ригхт == НУЛЛ) { цур_студент->ригхт = невстудент; ретурн 1; } цур_студент = цур_студент->десно; }}

Креирајте привремену променљиву која указује на структуру података: СТУДЕНТ_ДАТА *цур_студент;

Прођите кроз елементе, проверавајући жељену вредност: вхиле (цур_студент) { иф (цур_студент->студент_ИД == 15) { ретурн цур_студент->студент_граде; }

Гранање лево или десно, и петља, ако није пронађена: иф (цур_студент->студент_ИД < 15) { цур_студент = цур_студент->ригхт; } елсе { цур_студент = цур_студент->лефт; }

Погледајте да ли се петља завршава. Ако јесте, то значи да никада нисте пронашли ставку: }ретурн 0;

Одвојите бинарно стабло када се ваш програм заврши, јер сви оперативни системи неће то аутоматски обавити. Ово је најбоље урадити помоћу рекурзивне функције: воид деаллоцате_бинари_трее (СТУДЕНТ_ДАТА *трее) {

Рекурзивно одвојите лево и десно подстабло: деаллоцате_бинари_трее (стабло->лефт); деаллоцате_бинари_трее (стабло->десно);

Претраживање и додавање у бинарна стабла се такође може обавити помоћу рекурзије. Ово ће бити много лакше писати и одржавати, али мало теже разумети док се не навикнете. Уобичајено је креирати бинарно стабло које садржи само показиваче на другу Ц структуру података, често низ или повезану листу, где се налазе стварни подаци. Свако бинарно стабло је индекс за брзо претраживање једног поља података листе.

Брисање из бинарног стабла је веома компликован алгоритам у Ц, али у многим употребама бинарног стабла, елементи се никада не бришу.