Nano Hash - криптовалюты, майнинг, программирование

печатать двоичное дерево рекурсивно в c

Я работал над функцией, которая в основном должна печатать двоичное дерево, которое у меня есть в программе, и у меня возникла проблема. дерево динамическое, а значения - числа, большее новое число будет добавлено в правую сторону, а меньшее - в левую.

в основном, дерево должно быть напечатано так: допустим, есть только корень со значением 3, тогда вывод будет:

(3)

после добавления узла со значением 2:

((2)<(3))

вывод, который я получаю:

(((2))<(3))

после добавления 8:

((2)<(3)>(8))

вывод, который я получаю:

(((2))<(3)>((8))))

после добавления 7:

((2)<(3)>((7)<(8)))

вывод, который я получаю:

(((2))<(3)>(((7))<(8)))

и так далее... обратите внимание, что первый узел, корень, имеет другую структуру, поэтому разделение на 2 случая.

основная проблема в том, что я получаю слишком много скобок.

это код, который я написал до сих пор:

void PrintTree(Root* root, Node* currentNode,Boolean isFirst) {
    if (root == NULL)
        return;
    else if (root->right == NULL && root->left == NULL) {
        root->PrintObject(root->value);
        printf("\n");
    } else {
        printf("(");
        if (isFirst == TRUE) {
            if (root->left != NULL) {
                PrintTree(root,root->left, FALSE);
                printf("<");
            }
            root->PrintObject(root->value);

            if (root->right != NULL) {
                printf(">");
                PrintTree(root,root->right, FALSE);
            }
        } else {
            if (currentNode->left != NULL) {
                PrintTree(root,currentNode->left, FALSE);
                printf("<");
            }

            root->PrintObject(currentNode->value);

            if (currentNode->right != NULL) {
                printf(">");
                PrintTree(root,currentNode->right, FALSE);
            }
        }
      printf(")");
    }
  return;
}

void PrintObject(void* value) {
    printf("(%d)", *(int*)value);
    return;
}

был бы признателен за любую помощь. Благодарность!


  • root->PrintObject(...) выглядит неправильно. И вы, вероятно, могли бы упростить все, используя тип Node для корневого узла. 25.01.2015
  • эй, я не понимаю, в чем проблема с root-›PrintObject()? 25.01.2015
  • Ах, извините, я пропустил предложение о слишком большом количестве скобок. (Ну, root->PrintObject не должен компилироваться в C, если только Root не содержит элемент PrintObject, который является указателем на функцию, и я действительно не знаю, так ли это. Неважно.) Не могли бы вы привести пример того, какой вывод вы получаете по сравнению с . что вам нужно? 25.01.2015
  • это уже указано выше кода, я привел несколько примеров. 25.01.2015
  • Я должен сначала научиться правильно читать. Извиняюсь. Итак, если я правильно понял, ваш код печатает дополнительные скобки для листовых узлов (то есть узлов без дочерних элементов). Я предлагаю не печатать эти скобки. У вас уже есть условие, которое обрабатывает этот случай для корневого узла (root->left==NULL && root->right==NULL), но оно не помогает с другими узлами. Просто добавьте аналогичный для currentNode. 25.01.2015

Ответы:


1

проблема решена, пропущено условие:

void PrintTree(Root* root, Node* currentNode,Boolean isFirst)
{
  if (root==NULL)
    return;
  else if (root->right==NULL&&root->left==NULL)
    {
      root->PrintObject(root->value); 
      return;
    }
  else if (currentNode!=NULL)
    {
      if(currentNode->left==NULL&&currentNode->right==NULL&&isFirst==FALSE)
        root->PrintObject(currentNode->value);
        return;
    }
  else 
    {
      printf("(");
      if (isFirst==TRUE)
        {
          if (root->left!=NULL)
            {
              PrintTree(root,root->left,FALSE);
              printf("<");
            }
          root->PrintObject(root->value);

          if (root->right!=NULL)
            {
              printf(">");
              PrintTree(root,root->right, FALSE);
            }
        }
      else
        {

          if (currentNode->left!=NULL)
            {
              PrintTree(root,currentNode->left, FALSE);
              printf("<");
            }

          root->PrintObject(currentNode->value);

          if (currentNode->right!=NULL)
            {
              printf(">");
              PrintTree(root,currentNode->right, FALSE);
            }
        }
      printf(")");
    }
  return;
}
25.01.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..