შექმენით თქვენი ბინარული ხე. ყველა ბინარულ ხეს დასჭირდება სტრუქტურა, თუნდაც მას მხოლოდ ერთი ცვლადი ჰქონდეს. აირჩიეთ სახელი, შემდეგ გამოიყენეთ typedef მის შესაქმნელად: typedef struct student_data STUDENT_DATA;
განსაზღვრეთ სტრუქტურა. ჩართეთ ერთი და იგივე სტრუქტურის ორი მაჩვენებელი: struct student_data { int student_ID; int მოსწავლე_კლასი; STUDENT_DATA მარცხენა, მარჯვენა;};
გამოყავით მაჩვენებელი ამ მონაცემთა სტრუქტურას, ინიციალიზაცია NULL-ზე, რათა იყოს ხის თავი: STUDENT_DATA *students = NULL;
გამოყავით ორი დროებითი მაჩვენებელი მონაცემთა სტრუქტურაზე: STUDENT_DATA ახალი სტუდენტი, კურს_სტუდენტი;
გამოიყენეთ malloc() ახალი ელემენტის შესაქმნელად, ყოველთვის ამოწმებთ შეცდომას: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }
შეავსეთ ახალი ელემენტის ველები. დააყენეთ მისი მარცხენა და მარჯვენა ველები NULL: new_student->student_ID = newID; new_student->student_size = newsize; new_student->left = NULL; new_student->right = NULL;
განვიხილოთ ხელმძღვანელი ცვლადი. თუ head ცვლადი არის NULL, ეს არის ხეს დამატებული პირველი ელემენტი, ასე რომ დააყენეთ head ცვლადი, რომ მიუთითებდეს მასზე და დაასრულეთ: if (!students) { Students = new_student; დაბრუნების; }
დაამუშავეთ დუბლიკატი ჩანაწერი, თუ ახალი მნიშვნელობა და მიმდინარე მნიშვნელობა ტოლია: if (newID == cur_student->student_ID) { abort(); }
გაუმკლავდეთ არათანაბარ ღირებულებებს. თუ ახალი მნიშვნელობა ნაკლებია მიმდინარე მნიშვნელობაზე, ახალი ელემენტი გადადის მარცხნივ. დაუყოვნებლად დაამატეთ, თუ მარცხნივ არაფერია. წინააღმდეგ შემთხვევაში, ტრავერსი მარცხნივ და ციკლი: if (newID < cur_student->student_ID) { if (cur_student->left == NULL) { cur_student->left = newsstudent; დაბრუნება 1; } cur_student = cur_student->მარცხენა;
იგივე გააკეთე მარჯვნივ, წინააღმდეგ შემთხვევაში: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; დაბრუნება 1; } cur_student = cur_student->right; }}
შექმენით დროებითი ცვლადი, რომელიც მიუთითებს მონაცემთა სტრუქტურაზე: STUDENT_DATA *cur_student;
ელემენტების ციკლი, შეამოწმეთ სასურველი მნიშვნელობა: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }
ტოტი მარცხნივ ან მარჯვნივ და ციკლი, თუ ის ვერ მოიძებნა: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->left; }
ნახეთ თუ არა მარყუჟი მთავრდება. თუ ასეა, ეს ნიშნავს, რომ თქვენ ვერასოდეს იპოვეთ ნივთი: }return 0;
გაანაწილეთ ორობითი ხე, როდესაც თქვენი პროგრამა დასრულდება, რადგან ყველა ოპერაციული სისტემა არ გაუმკლავდება ამას ავტომატურად. ეს საუკეთესოდ კეთდება რეკურსიული ფუნქციის გამოყენებით: void deallocate_binary_tree (STUDENT_DATA *ხე) {
მარცხენა და მარჯვენა ქვეხეების გადანაწილება რეკურსიულად: deallocate_binary_tree (ხე->მარცხნივ); deallocate_binary_tree (ხე->მარჯვნივ);
ბინარული ხეების ძიება და დამატება ასევე შეიძლება განხორციელდეს რეკურსიის გამოყენებით. ამის დაწერა და შენარჩუნება ბევრად უფრო ადვილი იქნება, მაგრამ ცოტა უფრო რთული გასაგები, სანამ არ შეეგუებით. ჩვეულებრივია ორობითი ხის შექმნა, რომელიც შეიცავს მხოლოდ მაჩვენებლებს მეორე C მონაცემთა სტრუქტურაში, ხშირად მასივი ან დაკავშირებულ სიაში, სადაც არის რეალური მონაცემები. თითოეული ორობითი ხე არის ინდექსი სიის მონაცემების ერთი ველის სწრაფად მოსაძიებლად.
ორობითი ხიდან წაშლა ძალიან რთული ალგორითმია C-ში, მაგრამ ბინარული ხეების მრავალი გამოყენებისას ელემენტები არასოდეს იშლება.