Member 12898887 Ответов: 1

Как напечатать в консоли дерево горизонтально со ссылками на языке Си


Привет, я хотел бы напечатать данное двоичное дерево горизонтально на языке Си со связями между узлами.
Я сделал это без ссылок, но когда я попытался сделать это со ссылками, это действительно испортилось... Так что если кто-нибудь может дать мне решение, это будет очень полезно.

Спасибо...

ЗЫ: еще пояснения в картинках Нажмите здесь, чтобы просмотреть & вот структура, с которой я работаю :

typedef struct node{
         int val;            // value of the node
         struct node *left;  // left node
         struct node *right; // right node
      }node;


Что я уже пробовал:

Как я уже сказал я могу нарисовать дерево без связей между узлами с помощью этого кода но мне нужны связи между узлами
#define space 5

//secondary function
void draw_tree_hor2(node *tree, int distance)
{
    // stopping condition
    if (tree== NULL)
        return;

    // increase spacing
    distance += space;

    // start with right node
    draw_tree_hor2(tree->right, distance);

    // print root after spacing

    printf("\n");

    for (int i = space; i < distance; i++)
        printf(" ");

    printf("%d\n", tree->value);

    // go to left node
    draw_tree_hor2(tree->left, distance);
}

//primary fuction
void draw_tree_hor(node *tree)
{
   //initial distance is 0
	draw_tree_hor2(tree, 0);
}

1 Ответов

Рейтинг:
2

Patrice T

Как программист, ваша задача-создавать алгоритмы это решает конкретные проблемы, и вы не можете полагаться на кого-то другого, чтобы вечно делать это за вас, поэтому есть время, когда вам придется научиться этому. И чем скорее, тем лучше.
Когда вы просто просите решение, это все равно что пытаться научиться водить машину, обучая кого-то другого.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.

Не полное взрывное решение, но рекомендации:
Вы хотите визуализировать двоичное дерево в виде 2D-чертежа на консоли с корнем слева и листьями справа.
Факт, который влияет на рисунок:
- Консольный рисунок подразумевает целочисленные координаты

Вопросы, на которые нужно ответить, чтобы нарисовать дерево:
- Мое дерево может быть только корнем, как мне его нарисовать?
- Двоичное дерево не ограничено 7 узлами, ваша программа должна обрабатывать больше или меньше узлов.
- Двоичное дерево может быть не полным, некоторые родители могут иметь только 1 ребенка либо слева, либо справа.
- Дерево может быть не уравновешенным, некоторые листья могут находиться на разных уровнях.
- презентация: вы должны уметь обрабатывать минимальное расстояние между узлами по горизонтали и вертикали.
- С помощью / и \ может быть сложно использовать, так как ориентация может не соответствовать чертежу.
- Вам нужно спланировать достаточно места между узлами везде, чтобы избежать столкновения линий рисования и узлов.
- размещение нового узла может означать перемещение всех родительских узлов каскадом к корню. Если возникает нецелочисленная позиция, это будет означать перемещение поддерева для исправления проблемы.

Вам нужно будет где-то хранить координаты узлов и, возможно, массив последней использованной позиции на каждом уровне

Этот редактор графиков позволит вам рисовать деревья, он имеет аккуратную функцию интервальных узлов для визуализации вашего графика в соответствии с правилами интервалов.
да - редактора графической [^]

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