- Функция за намиране на брой възли
- int N(node *el)
- {
- if (el == NULL) return 0;
- else return N(el->L) + N(el->R) + 1;
- }
- Ако имаме дървото:
- 5
- / \
- 4 3
- / \
- 2 1
- 1. Първо, извикваме функцията със стойността на корена. Т.е -> N(5);
- 2. При N(5):
- - el = 5 (не е NULL), затова НЕ връщаме 0
- - връщаме N(el->L) + N(el->R) + 1
- Затова остава:
- return N(4) + N(3) + 1;
- 3. При N(4) + N(3) + 1;
- - разглеждаме само N(4)
- - el = 4 (не е NULL), затова НЕ връщаме 0
- - връщаме N(el->L) + N(el->R) + 1
- - добавяме и останалата част от предишното извикване, която е
N(3) + 1
- Затова остава:
- return N(2) + N(1) + 1 + N(3) + 1;
- 4. При N(2) + N(1) + 1 + N(3) + 1;
- - разглеждаме само N(2)
- - el = 2 (не е NULL), затова НЕ връщаме 0
- - връщаме N(el->L) + N(el->R) + 1
- N(el->L) и N(el->R) са NULL, така че N(2) връща само 1
- - добавяме и останалата част от предишното извикване, която е
N(1) + 1 + N(3) + 1
- Затова остава:
- return 1 + N(1) + 1 + N(3) + 1;
- 5. При 1 + N(1) + 1 + N(3) + 1;
- - разглеждаме само N(1)
- - el = 1 (не е NULL), затова НЕ връщаме 0
- връщаме N(el->L) + N(el->R) + 1
- - N(el->L) и N(el->R) са NULL, така че N(1) връща само 1
- - добавяме и останалата част от предишното извикване, която е
1 + 1 + N(3) + 1
- Затова остава:
- return 1 + 1 + 1 + N(3) + 1;
- 6. При 1 + 1 + 1 + N(3) + 1;
- - разглеждаме само N(3)
- - el = 3 (не е NULL), затова НЕ връщаме 0
- - връщаме N(el->L) + N(el->R) + 1
- N(el->L) и N(el->R) са NULL, така че N(3) връща само 1
- - добавяме и останалата част от предишното извикване, която е
1 + 1 + 1 + 1
- Затова остава:
- return 1 + 1 + 1 + 1 + 1;
- 7. Броят на възлите е 5.
16 януари 2016 г.
Намиране на брой възли в двоично дърво (BST) - в дълбините на рекурсията...
Написах едно обяснение за това как точно работи рекурсията в една проста функция за намиране на брой възли. Нищо особено, просто "вникване на дълбоко" в изпълнението на рекурсията, която може да бъде объркваща понякога...
Абонамент за:
Коментари за публикацията (Atom)
Няма коментари:
Публикуване на коментар