В бинарном дереве найти длину (число ветвей) пути от корня до ближайшей вершины - C (СИ)

Узнай цену своей работы

Формулировка задачи:

В заданном непустом бинарном дереве найти длину (число ветвей) пути от корня до ближайшей вершины со значением, равным заданному. Использовать алгоритм обратного обхода. Надеюсь, сможете помочь, собственно, с написанием алгоритма для нахождения длины пути. Все остальное написала, но здесь- я в тупике, было несколько идей, но что-то пошло не так. Заранее благодарна
Листинг программы
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. struct btree {
  6. btree() :e(), l(), r() {}
  7. int e;
  8. btree *l, *r;
  9. };
  10. struct list {
  11. btree *z;
  12. list *next;
  13. };
  14. typedef list stack;
  15. stack *iinput(btree *x, stack *head) {//добавление элемента в стек
  16. stack *s;
  17. s = new list;
  18. s->z = x;
  19. s->next = head;
  20. head = s;
  21. return head;
  22. }
  23. btree *gget(stack **head) {//взятие элемента из стека
  24. btree *x = (*head)->z;
  25. stack *g = (*head)->next;
  26. *head = NULL;
  27. *head = g;
  28. return x;
  29. }
  30. void add(btree **t, int value){//ввод дерева
  31. if (*t == NULL) {
  32. *t = new btree;
  33. (*t)->e = value;
  34. }
  35. else {
  36. btree *t2 = *t;
  37. while (t2 != NULL) {
  38. if (t2->e < value) { //Направо
  39. if (t2->r == NULL) {
  40. t2->r = new btree;
  41. t2->r->e = value;
  42. t2 = NULL; }
  43. else {
  44. t2 = t2->r; } }
  45. else{ //Налево
  46. if (t2->l == NULL) {
  47. t2->l = new btree;
  48. t2->l->e = value;
  49. t2 = NULL; }
  50. else {
  51. t2 = t2->l;
  52. }}}}}
  53. void obh(btree *d) {//вычисление длины пути до ближайшей вершины с подходящим значением
  54. stack *S = NULL; int F = 1, x;
  55. printf("zadaite zna4enie \n");
  56. scanf("%d", &x);
  57. while (F){
  58. while (d != NULL) {
  59. S = iinput(d, S);
  60. d = d->l;
  61. }
  62. if (S != NULL) {
  63. d = gget(&S);
  64. //добавить действия
  65. d = d->r;
  66. }
  67. else F = 0;
  68. }
  69. printf("dlina puti= %d \n", p);
  70. }
  71. int main(){
  72. int x;
  73. btree *T = NULL;
  74. printf("vvedite derevo \n");
  75. while ((_kbhit() == 0) && (_getch() != 27)) {
  76. scanf("%d", &x);
  77. add(&T, x);
  78. }
  79. printf("okon4en vvod dereva \n");
  80. obh(T);
  81. _getch();
  82. }

Решение задачи: «В бинарном дереве найти длину (число ветвей) пути от корня до ближайшей вершины»

textual
Листинг программы
  1. #include <limits.h>
  2.  
  3. int path_length(btree* root, int needed) {
  4.     if ( ! root ) // значение не найдено
  5.         return INT_MIN;
  6.     if ( root->e == needed )
  7.         return 0;
  8.     return 1 + path_length( ( (root->e > needed ) ? root->l : root->r), needed);
  9. }
  10.  
  11. /*...*/
  12. // где-то в программе
  13. int len, needed;
  14. btree* root;
  15. //...
  16. if ( ( len = path_length(root, needed) ) < 0 )
  17.   // не найдено
  18. else
  19.   // в len длина пути

Объяснение кода листинга программы

Представленный код - это рекурсивная функция, которая использует бинарное дерево для поиска пути от корня до ближайшей вершины, удовлетворяющей определенному условию (в данном случае, когда значение равно needed). Вот список, объясняющий, что происходит в коде:

  1. *int path_length(btree root, int needed)** - это функция, которая принимает два аргумента: root, который является узлом в бинарном дереве, и needed, которое является значением, которое мы ищем.
  2. if ( ! root ) - проверка, является ли root пустым. Если это так, функция возвращает INT_MIN, что означает, что путь не найден.
  3. if ( root->e == needed ) - проверка, равно ли значение в узле root требуемому значению needed. Если это так, функция возвращает 0, что означает, что путь найден.
  4. return 1 + path_length( ( (root->e > needed ) ? root->l : root->r), needed); - рекурсивный вызов функции path_length для левого или правого поддерева (в зависимости от того, больше ли значение в текущем узле, чем needed). Это продолжается, пока не будет найдено совпадение или пока не будет достигнут корень дерева.
  5. В другом месте программы, функция вызывается с помощью len = path_length(root, needed). Если значение len меньше нуля, это означает, что путь не найден. В противном случае, len содержит длину пути.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы