2016-12-11 1 views
0

Я отправляю свой вопрос (явно недостаточно информации). Я хотел бы напечатать данное двоичное дерево по горизонтали в C со ссылками между узлами. Я сделал это без ссылок; когда я пытался сделать это со ссылками, он действительно перепутался.Как печатать в консоли дерево по горизонтали со ссылками с помощью c

PS: Другие объяснения в изображениях Click here to view и вот структура Я работаю с:

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); 
} 

Если информации, которую я дал, недостаточно, пожалуйста, сообщите мне ...

+0

Я предполагаю, что это домашнее задание, так как там был [подобный вопрос] (http://stackoverflow.com/questions/41090663/how-to-print-in-console -a-tree-horizotally-with-links-using-c-language # 41090663) с идентичным графиком в последнее время. –

+0

Добро пожаловать в переполнение стека. Вскоре прочитайте страницы [О программе] и [Спросить]. Похоже, вы узнали о том, как создать MCVE ([MCVE]). Также похоже, что вы задавали этот вопрос раньше, как другой пользователь ([Как печатать на консоли дерево по горизонтали со ссылками] (http://stackoverflow.com/questions/41090663/how-to-print-in-console- a-tree-horizotally-with-links-using-c-language), как и у другого пользователя. Этот вопрос, по крайней мере, получил некоторый код, который другой был лишен недостатка. Можем ли мы быть уверены, что вы не просто удалите свою учетную запись и/или вопрос на этот раз? –

+1

нет, это я, это сообщение, что вопрос тоже, по ошибке я удалил accout, так что создал новый, и отправьте тот же вопрос здесь с более подробной информацией ... –

ответ

1

Я выбросил что-то вместе, очень быстро, кажется, работает. Возможно, вы захотите добавить некоторые проверки для предотвращения того, чтобы depth превысил размер path и т. Д. Должно получиться как минимум.

#include <stdio.h> 

#define space 5 


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

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

    // increase spacing 
    depth++; 

    // start with right node 
    draw_tree_hor2(tree->right, depth, path, 1); 

    // set | draw map 
    path[depth-2] = 0; 

    if(right) 
     path[depth-2] = 1; 

    if(tree->left) 
     path[depth-1] = 1; 

    // print root after spacing 
    printf("\n"); 

    for(int i=0; i<depth-1; i++) 
    { 
     if(i == depth-2) 
      printf("+"); 
     else if(path[i]) 
      printf("|"); 
     else 
      printf(" "); 

     for(int j=1; j<space; j++) 
     if(i < depth-2) 
      printf(" "); 
     else 
      printf("-"); 
    } 

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

    // vertical spacers below 
    for(int i=0; i<depth; i++) 
    { 
     if(path[i]) 
      printf("|"); 
     else 
      printf(" "); 

     for(int j=1; j<space; j++) 
      printf(" "); 
    } 

    // go to left node 
    draw_tree_hor2(tree->left, depth, path, 0); 
} 

//primary fuction 
void draw_tree_hor(node *tree) 
{ 
    // should check if we don't exceed this somehow.. 
    char path[255] = {}; 

    //initial depth is 0 
    draw_tree_hor2(tree, 0, path, 0); 
} 



node n1, n2, n3, n4, n5, n6, n7; 

int main() 
{ 
    n1.value = 1; 
    n2.value = 2; 
    n3.value = 3; 
    n4.value = 4; 
    n5.value = 5; 
    n6.value = 6; 
    n7.value = 7; 

    n1.right = &n2; 
    n1.left = &n3; 
    //n2.right = &n4; 
    //n2.left = &n5; 
    n3.right = &n6; 
    n3.left = &n7; 

    n2.right = &n3; 
    n2.left = &n3; 

    draw_tree_hor(&n1); 

    return 0; 
} 

Выход:

>gcc test_graph.c && a 

      +----6 
      | 
    +----3 
    | | 
    | +----7 
    | 
+----2 
| | 
| | +----6 
| | | 
| +----3 
|   | 
|   +----7 
| 
1 
| 
| +----6 
| | 
+----3 
    | 
    +----7 
+0

Это прекрасно работает , Спасибо, сэр. Я пытаюсь понять процесс алгоритма, так как кажется, что вы использовали идею пути и глубины (я об этом не думал), спасибо еще раз :) –

+0

Добро пожаловать :) Горизонтальные линии были довольно легко. Вертикали были немного сложнее. Вероятно, «путь» был плохим именем переменной. Это в основном экономит на том, какие глубины нам нужны вертикальные линии в текущей строке. Если мы имеем право на что-то, нам нужно будет '' 'один уровень выше, пока мы не достигнем узла. Если есть субнод слева, нам понадобятся '|' на текущей глубине, пока мы не достигнем узла и т. Д. –

+0

Я вижу это ясно сейчас, отличная идея! :) –

Смежные вопросы