Вывод бинарного дерева - C (СИ)

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

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

Нужно написать программу, которая будет выводить дерево на экран. Заготовка есть, дерево уже выводится, но нету стрелочек, которые бы облегчали восприятие дерева(как на картинке)... Может, у кого еще есть код печати красивого дерева на Си, очень сильно поможет. Пожалуйста, очень сильно можете.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
struct treeNode
{
    struct treeNode *leftPtr;
    int data;
    struct treeNode *rightPtr;
};
 
typedef struct treeNode TREENODE;
typedef TREENODE *TREENODEPTR;
 
void insertNode(TREENODEPTR *, int);
void printTree(TREENODEPTR, int);
 
main()
{
    int i, item;
    TREENODEPTR rootPtr = NULL;
    srand(time(NULL));
    
    printf("The numbers being placed in the tree are:\n");
    
    for(i=1;i<=10;i++)
    {
        item = rand() % 100;
        printf("%3d", item);
        insertNode(&rootPtr, item);
    }

    int p=0;
    printf("\n\n\n\n\n\nTree:\n");
    printTree(rootPtr,p);
    
    return 0;
}
 
void insertNode (TREENODEPTR *treePtr, int value)
{
    if (*treePtr == NULL)
    {
        *treePtr = malloc(sizeof(TREENODE));
        if (*treePtr != NULL)
        {
            (*treePtr)->data = value;
            (*treePtr)->leftPtr = NULL;
            (*treePtr)->rightPtr = NULL;
        }
        else
            printf("Not inserted");
    }
    else
        if(value < (*treePtr)->data)
            insertNode(&((*treePtr)->leftPtr), value);
        else
            if(value > (*treePtr)->data)
            insertNode(&((*treePtr)->rightPtr), value);
        else
            printf("dup");  
}
 
void printTree(TREENODEPTR treePtr, int p)
{
    int i;
        if(treePtr != NULL)
    {
        printTree(treePtr->rightPtr,p+3);
        for(i=0;i<p;i++)
        {
            printf(" ");
        }
        printf("%3d\n", treePtr->data);
        printTree(treePtr->leftPtr,p+3);
    }
}

Решение задачи: «Вывод бинарного дерева»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
struct treeNode
{
    struct treeNode *leftPtr;
    int data;
    struct treeNode *rightPtr;
};
 
typedef struct treeNode TREENODE;
typedef TREENODE *TREENODEPTR;
 
void insertNode(TREENODEPTR *, int);
void inOrder(TREENODEPTR);
void printTree(TREENODEPTR, int);
//void printTree2(TREENODEPTR);
 
main()
{
    int i, item;
    TREENODEPTR rootPtr = NULL;
    srand(time(NULL));
    
    printf("The numbers being placed in the tree are:\n");
    
    for(i=1;i<=10;i++)
    {
        item = rand() % 100;
        printf("%3d", item);
        insertNode(&rootPtr, item);
    }
    
    //printf("\n\n\nInorder:");
    //inOrder(rootPtr);
    
    int p=0;
    printf("\n\n\n\n\n\nTree:\n");
    //printTree(rootPtr,p);
    //printf("\n\n\n\n\n\nTree:\n");
    //printTree2(rootPtr);
    
    return 0;
}
 
void insertNode (TREENODEPTR *treePtr, int value)
{
    if (*treePtr == NULL)
    {
        *treePtr = malloc(sizeof(TREENODE));
        if (*treePtr != NULL)
        {
            (*treePtr)->data = value;
            (*treePtr)->leftPtr = NULL;
            (*treePtr)->rightPtr = NULL;
        }
        else
            printf("Not inserted");
    }
    else
        if(value < (*treePtr)->data)
            insertNode(&((*treePtr)->leftPtr), value);
        else
            if(value > (*treePtr)->data)
            insertNode(&((*treePtr)->rightPtr), value);
        else
            printf("dup");  
}
 
void inOrder(TREENODEPTR treePtr)
{
    if(treePtr != NULL)
    {
        inOrder(treePtr->leftPtr);
        printf("%3d", treePtr->data);
        inOrder(treePtr->rightPtr);
    }
}
 
/*void printTree(TREENODEPTR treePtr, int p)
{
    int i;
        if(treePtr != NULL)
    {
        printTree(treePtr->rightPtr,p+3);
        for(i=0;i<p;i++)
        {
            printf(" ");
        }
        printf("%3d\n", treePtr->data);
        printTree(treePtr->leftPtr,p+3);
    }
}*/
 
/*void printTree2(TREENODEPTR treePtr)
{
    int i=0, z=0;
    if(treePtr != NULL)
    {
        i++;
        printTree2(treePtr->leftPtr);
        for(z=0;z<i;z++)
        {
            printf(" ");
        }
        printf("%3d\n", treePtr->data);
        printTree2(treePtr->rightPtr);
        i--;
    }*/
    
    
void showLine(char* c, int p, int s) {
    int t=s, i; for(i=0; i<p; i++) {printf(t&1 ? "|  " : "   "); t/=2;} printf(c);
}
void showTree(TREENODEPTR wood, int p, int s) { // string s = string("")) {
    if (wood == NULL) return;
    printf("%d", wood->data); printf("\n");
    
    if (wood->leftPtr != NULL) {
        showLine("|\n", p, s); showLine("L: ", p, s);
        showTree(wood->leftPtr, p+1, s + ((wood->rightPtr == NULL ? 0 : 1)<<p)); 
    }
    if (wood->rightPtr != NULL) {        
        showLine("|\n", p, s); showLine("R: ", p, s);
        showTree(wood->rightPtr, p+1, s);
    }
}

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

В этом коде реализована функция showTree, которая позволяет выводить бинарное дерево в отступе. Вот список действий, которые она выполняет:

  1. Если переданный ей указатель на узел дерева равен NULL, функция просто возвращает управление.
  2. Функция выводит значение узла (data) и переходит к следующему узлу.
  3. Если у текущего узла есть левое поддерево (leftPtr), функция сначала выводит горизонтальную линию, затем символ L: и координаты этой линии, затем вызывает себя для левого поддерева.
  4. Если у текущего узла есть правое поддерево (rightPtr), функция выводит горизонтальную линию, затем символ R: и координаты этой линии, затем вызывает себя для правого поддерева.
  5. Если у текущего узла нет ни левого, ни правого поддерева, функция просто переходит к следующему узлу. Список функций, используемых в коде:
  6. insertNode: Вставляет новый узел в дерево. Если дерево пусто, новый узел становится корнем. Если узел с таким значением уже существует, вставка не происходит.
  7. inOrder: Обход дерева в порядке возрастания. Рекурсивная функция.
  8. printTree: Выводит дерево в отступе. Рекурсивная функция.
  9. showLine: Выводит горизонтальную линию и символы L: и R: с отступами.
  10. showTree: Выводит дерево в отстуде. Рекурсивная функция. Список переменных, используемых в коде:
  11. main: главная функция программы
  12. i, item: используются для итерации по массиву чисел, которые нужно вставить в дерево
  13. rootPtr: указатель на корень дерева
  14. srand, time(NULL): используются для инициализации генератора случайных чисел
  15. treeNode, TREENODE, treeNodePTR, TREENODEPTR: типы данных и указатели на структуру узла дерева
  16. insertNode, inOrder, printTree, showTree: функции, используемые для работы с деревом
  17. p, item, wood: используются в функции showTree для итерации по дереву и вывода значений узлов.

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


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

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

11   голосов , оценка 4.364 из 5
Похожие ответы