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