Вывод бинарного дерева - 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
для итерации по дереву и вывода значений узлов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д