Построить бинарное дерево поиска из букв строки, вводимой пользователем - C (СИ)

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

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

Не совсем понимаю как сделать данное задание, так и в плане реализации, помогите: "Построить бинарное дерево поиска из букв строки, вводимой пользователем. Разработать функцию, которая для заданной буквы определяет число узлов в правом и левом поддеревьях."

Решение задачи: «Построить бинарное дерево поиска из букв строки, вводимой пользователем»

textual
Листинг программы
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. // описание элемента дерева поиска
  5. typedef struct NODE
  6. {
  7.     char key;
  8.     long count;
  9.     struct NODE *left, *right;
  10. } NODE;
  11.  
  12. // вставка элемента со значением x в дерево поиска
  13. void Insert(NODE **q, char x)
  14. {
  15.    if (*q == NULL)
  16.    {
  17.        *q = (NODE *)malloc(sizeof(NODE));
  18.        (*q)->key = x;
  19.        (*q)->count = 1;
  20.        (*q)->left = (*q)->right = NULL;
  21.    }
  22.    else
  23.    {
  24.       if ((*q)->key == x)
  25.           ((*q)->count)++;
  26.       else
  27.          if ((*q)->key > x)
  28.              Insert(&((*q)->left), x);
  29.          else Insert(&((*q)->right), x);
  30.    }
  31. }
  32.  
  33. // вывод элементов дерева поиска на экран в порядке возрастания и количеством повторений
  34. void Display(NODE *q)
  35. {
  36.    if (q != NULL)
  37.    {
  38.       Display(q->left);
  39.       printf("%c : %d\n", q->key, q->count);
  40.       Display(q->right);
  41.    }
  42. }
  43.  
  44. // количество вершин
  45. long Count(NODE *q)
  46. {
  47.    return q == NULL ? 0 : 1 + Count(q->left) + Count(q->right);
  48. }
  49.  
  50. // поиск вершины с определенным значением
  51. NODE *Search(NODE *q, char x)
  52. {
  53.    if (q == NULL)
  54.       return NULL;
  55.    else
  56.       if (q->key == x)
  57.          return q;
  58.       else
  59.          if (q->key > x)
  60.             return Search(q->left, x);
  61.          else
  62.             return Search(q->right, x);
  63. }
  64.  
  65. int main()
  66. {
  67.    NODE *root = NULL, *q;
  68.    char s[] = "abcdeaba", *ps, c = 'a';
  69.    for(ps = s; *ps; ++ps)
  70.       Insert(&root, *ps);
  71.    Display(root);
  72.    if (q = Search(root, c))
  73.    {
  74.        printf("left: %d\n", Count(q->left));
  75.        printf("right: %d\n", Count(q->right));
  76.    }
  77.    else puts("no");
  78.    return 0;
  79. }

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

  1. В коде используется структура данных NODE для представления элемента дерева поиска, которая содержит ключ, счетчик и указатели на левое и правое поддерево.
  2. Функция Insert отвечает за вставку элемента в дерево поиска. Если дерево пусто, создается новый узел, иначе элемент вставляется в соответствующее поддерево в зависимости от значения ключа.
  3. Функция Display выводит элементы дерева поиска в порядке возрастания и подсчитывает количество повторений каждого элемента.
  4. Функция Count возвращает количество вершин в дереве.
  5. Функция Search отвечает за поиск элемента в дереве. Если элемент не найден, возвращается NULL.
  6. В функции main создается пустое дерево поиска, затем в него вставляются все символы из строки s.
  7. Затем происходит поиск символа 'a' в дереве и выводится количество его вхождений в левое и правое поддерево.
  8. В конце программы выводится сообщение no, если символ не найден.

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


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

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

13   голосов , оценка 3.769 из 5

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

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

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