Поиск элемента в бинарном дереве - C (СИ)

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

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

Разработать программу, формирующую динамическую структуру данных для хранения генеалогического дерева. Каждая вершина дерева должна содержать следующую информацию: имя и год рождения. Вопрос по синтаксису языка СИ. Если в написанной ниже программе попытаться добавить на третий уровень генеалогического дерева лист, который должен будет исходить из листа-матери на втором уровне, то программа благополучно вылетит. Это связано с функцией "Search". Дело в том, что при рекурсивном обходе бинарного дерева, оператор "return" необъяснимым для меня образом завершает не только выполнение функции, вызванной из функции, но и все открытые при помощи рекурсии до этого функции. Help, please
Листинг программы
  1. /*Компилятор Code::Blocks 13.12
  2. Selected compiler GNU GCC Compiler*/
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <windows.h>
  6. struct Node {
  7. char Name[40];
  8. int Year;
  9. struct Node *left;
  10. struct Node *right;
  11. };
  12. typedef struct Node *PNode;
  13. PNode Search (PNode Tree, char Name[]) {
  14. if ( ! Tree ) return;
  15. Search(Tree->left, Name);
  16. if (strcmp(Tree->Name, Name) == 0)
  17. return Tree;
  18. Search(Tree->right, Name);
  19. };
  20. PNode CreateLeaf () {
  21. char Name[40];
  22. int Year;
  23. PNode NewNode = malloc(sizeof(struct Node));
  24. printf("Введите имя: ");
  25. scanf("%s", &Name);
  26. printf("Введите дату рождения: ");
  27. scanf("%d", &Year);
  28. strcpy(NewNode->Name, Name);
  29. NewNode->Year = Year;
  30. NewNode->left = NULL;
  31. NewNode->right = NULL;
  32. return NewNode;
  33. };
  34. void ShowAllLeafs (PNode Tree) {
  35. if ( ! Tree ) return;
  36. ShowAllLeafs(Tree->left);
  37. printf("%s - %d\n", Tree->Name, Tree->Year);
  38. ShowAllLeafs(Tree->right);
  39. };
  40. void main () {
  41. PNode Root, p1;
  42. SetConsoleCP(1251);
  43. SetConsoleOutputCP(1251);
  44. printf(" Создайте корень генеалогического дерева\n");
  45. Root = CreateLeaf();
  46. int input;
  47. char Name[40];
  48. while ( 1 ) {
  49. system("cls");
  50. printf("1. Добавить лист к генеалогическому дереву\n");
  51. printf("2. Вывести всю введённую информацию\n");
  52. printf("3. Выход\n");
  53. scanf( "%d", &input );
  54. switch (input) {
  55. case 1:
  56. system("cls");
  57. printf("Введите имя листа, к которому хотите обратиться: ");
  58. scanf("%s", Name);
  59. p1 = Search(Root, Name);
  60. printf("\n Добавление матери...\n");
  61. p1->left = CreateLeaf();
  62. printf("\n Добавление отца...\n");
  63. p1->right = CreateLeaf();
  64. break;
  65. case 2:
  66. system("cls");
  67. ShowAllLeafs(Root);
  68. getch();
  69. break;
  70. case 3:
  71. return;
  72. default :
  73. break;
  74. }
  75. }
  76. return;
  77. };

Решение задачи: «Поиск элемента в бинарном дереве»

textual
Листинг программы
  1. PNode search(PNode tree, const char * name) {
  2.     if ( ! tree )
  3.         return NULL;
  4.     else if ( strcmp(tree->Name, name) == 0 )
  5.         return tree;
  6.     else {
  7.         PNode p = search(tree->left, name);
  8.         return ( p ) ? p : search(tree->right, name);
  9.     }
  10. }

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

  1. Функция search принимает два аргумента: PNode tree и const char * name.
  2. Если tree равно NULL, функция возвращает NULL.
  3. Если strcmp(tree->Name, name) равно 0, функция возвращает tree.
  4. Если tree не равно NULL, функция вызывает search для левого поддерева tree->left и name, и если результат не равен NULL, возвращает его.
  5. Если result поискового запроса в левом поддереве равен NULL, функция вызывает search для правого поддерева tree->right и name, и если результат не равен NULL, возвращает его.
  6. Если оба поддерева возвращают NULL, функция возвращает NULL.

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


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

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

7   голосов , оценка 3.714 из 5

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

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

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