Вывод бинарного дерева - 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, которая позволяет выводить бинарное дерево в отступе. Вот список действий, которые она выполняет:
- Если переданный ей указатель на узел дерева равен NULL, функция просто возвращает управление.
- Функция выводит значение узла (data) и переходит к следующему узлу.
- Если у текущего узла есть левое поддерево (leftPtr), функция сначала выводит горизонтальную линию, затем символ
L:и координаты этой линии, затем вызывает себя для левого поддерева. - Если у текущего узла есть правое поддерево (rightPtr), функция выводит горизонтальную линию, затем символ
R:и координаты этой линии, затем вызывает себя для правого поддерева. - Если у текущего узла нет ни левого, ни правого поддерева, функция просто переходит к следующему узлу. Список функций, используемых в коде:
insertNode: Вставляет новый узел в дерево. Если дерево пусто, новый узел становится корнем. Если узел с таким значением уже существует, вставка не происходит.inOrder: Обход дерева в порядке возрастания. Рекурсивная функция.printTree: Выводит дерево в отступе. Рекурсивная функция.showLine: Выводит горизонтальную линию и символыL:иR:с отступами.showTree: Выводит дерево в отстуде. Рекурсивная функция. Список переменных, используемых в коде:main: главная функция программыi,item: используются для итерации по массиву чисел, которые нужно вставить в деревоrootPtr: указатель на корень дереваsrand,time(NULL): используются для инициализации генератора случайных чиселtreeNode,TREENODE,treeNodePTR,TREENODEPTR: типы данных и указатели на структуру узла дереваinsertNode,inOrder,printTree,showTree: функции, используемые для работы с деревомp,item,wood: используются в функцииshowTreeдля итерации по дереву и вывода значений узлов.