Функция вывода бинарного дерева

Бинарные деревья (кратко о главном)

Вообще, надо признаться, что тема иерархических структур весьма широка. О ней можно спорить много и долго, и так и не прийти к общему знаменателю, четко показывающему что такое иерархия и как с ней работать, по каким канонам в смысле. Я не стану вдаваться в ужасные дебри математического Тартара. Это никому кроме академиков не интересно, и в практическом обозримом слишком тонко.

Итак. В качестве примера дерева возьмем двоичное дерево. Что такое дерево вообще? Это некий набор данных, которые указывают на другие данные. Динамический список. Кстати списки это частный вид дерева. Причем двоичного.

Дерево состоит из веток (узлов) и листьев (элементов). Листья – это узлы, которые не указывают ни на кого, у них нет веточек. Бинарное дерево – это дерево, в котором у ветки может быть не более двух листьев или веток. Отсюда и его название – “бинарное” значит “двоичное”, т.е. элементов два или меньше. Но никак не более двух.

У обычного дерева узлов у веток больше может быть.

Не буду вдаваться в классификации деревьев. Это тоже большой объем информации. Об этом можно почитать в Википедии, какие они бывают. Можно набрать в поиске слово “Граф” и почитать. Главное не наткнуться на настоящего графа, у которого бывают графини. По четвергам и субботам 🙂

Основное правило формирования бинарного дерева в С++: Если значение узла больше добавляемого – добавляется ветка справа, иначе создается ветка слева.

Правило простое, от него и будем отталкиваться. Для этого нам понадобится структура, описываемая наподобие динамического списка: Поле данных и два указателя на правую и левую ветки. В динамических списках два указателя обычно связывают следующий и предыдущий элементы, в случае с деревом этого не понадобится, поскольку, как правило, проход по дереву идет с корня. Хотя конечно же может быть и обратная связь, если очень захочется.

Источник

Вывод бинарного дерева

Вывод бинарного дерева
Помогите пожалуйста, как вывести бинарное дерево в виде дерева? Само дерево и обход у меня есть, а.

Вывод бинарного дерева
Помогите, пожалуйста, с программой. Нужно вывести бинарное дерево так, как выводится дерево.

вывод бинарного дерева
Не могу понять в чем ошибка , функции описаны верно но на выводе хаотичные данные При вводе.

Реализация и вывод бинарного дерева
Помогите создать бинарное дерево и вывести его на экран по уровням. Заранее спасибо.

Лучший ответ

Сообщение было отмечено как решение

Решение

Иногда полезно пользоваться поиском по форуму

1. Создание пустого дерева
2. Добавление элемента в дерево.
3. Удаление поддерева с заданной корневой вершиной.
4. Вывод структуры дерева на экран монитора.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#include struct node { int Key; int Count; node *Left; node *Right; }; class TREE { private: node *Tree; //Указатель на корень дерева. void Search (int,node**); public: TREE() {Tree=NULL;} node** GetTree () {return &Tree;} //Получение вершины дерева. void BuildTree (); void CleanTree (node **); void ObhodEnd (node **); void ObhodLeft (node **); void ObhodBack (node **); void Vyvod (node**,int); int Height (node**); }; void main () { TREE A; A.BuildTree (); cout"\nВывод дерева:\n"; A.Vyvod (A.GetTree(),0); cout"\nВысота дерева:"A.Height(A.GetTree())endl; cout"\nЛевосторонний обход дерева: "; A.ObhodLeft (A.GetTree()); cout"\nКонцевой обход дерева: "; A.ObhodEnd (A.GetTree()); cout"\nОбратный обход дерева: "; A.ObhodBack (A.GetTree()); A.CleanTree (A.GetTree()); } void TREE::BuildTree () // Построение бинарного дерева (рекурсивный алгоритм). // Tree - указатель на корень дерева. { int el; cout"Вводите ключи вершин дерева . \n"; cin>>el; while (el!=0) { Search (el,&Tree); cin>>el; } } void TREE::Search (int x,node **p) // Поиск вершины с ключом x в дереве со вставкой // (рекурсивный алгоритм). // *p - указатель на корень дерева. { if (*p==NULL) {// Вершины в дереве нет; включить ее. *p = new(node); (**p).Key = x; (**p).Count = 1; (**p).Left = NULL; (**p).Right = NULL; } else if (x(**p).Key) Search (x,&((**p).Left)); else if (x>(**p).Key) Search (x,&((**p).Right)); else (**p).Count = (**p).Count + 1; } void TREE::ObhodLeft (node **w) //Левосторонний обход дерева. //*w - указатель на корень дерева. { if (*w!=NULL) { cout(**w).Key" "; ObhodLeft (&((**w).Left)); ObhodLeft (&((**w).Right)); } } void TREE::ObhodEnd (node **w) //Концевой обход дерева. //*w - указатель на корень дерева. { if (*w!=NULL) { ObhodEnd (&((**w).Left)); ObhodEnd (&((**w).Right)); cout(**w).Key" "; } } void TREE::ObhodBack (node **w) //Обратный обход дерева. //*w - указатель на корень дерева. { if (*w!=NULL) { ObhodBack (&((**w).Left)); cout(**w).Key" "; ObhodBack (&((**w).Right)); } } void TREE::CleanTree (node **w) //Очистка дерева. //*w - указатель на корень дерева. { if (*w!=NULL) { CleanTree (&((**w).Left)); CleanTree (&((**w).Right)); delete *w; } } void TREE::Vyvod (node **w,int l) //Изображение дерева *w на экране дисплея // (рекурсивный алгоритм). //*w - указатель на корень дерева. { int i; if (*w!=NULL) { Vyvod (&((**w).Right),l+1); for (i=1; il; i++) cout" "; cout(**w).Keyendl; Vyvod (&((**w).Left),l+1); } } int TREE::Height (node **w) //Определение высоты бинарного дерева. //*w - указатель на корень дерева. { int h1,h2; if (*w==NULL) return (-1); else { h1 = Height (&((**w).Left)); h2 = Height (&((**w).Right)); if (h1>h2) return (1 + h1); else return (1 + h2); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#include #include #include #include struct Node { int key; Node *left; Node *right; }; Node *root; Node *Add_Node(Node *root,int value) { if(!root) { root=new Node; root->left=root->right=NULL; root->key=value; return root; } if(valueroot->key) root->left=Add_Node(root->left,value); else if(value>root->key) root->right=Add_Node(root->right,value); return root; } void Print_Node(Node *root) { if(!root) return; printf("("); printf("%d",root->key); Print_Node(root->left); Print_Node(root->right); printf(")"); } void main() { setlocale(LC_ALL,"Rus"); int i,a[10]={2,5,7,1,4,3,9,12,6}; for(i=0;i9;i++) root=Add_Node(root,a[i]); Print_Node(root); getch(); }

Вывод бинарного дерева в консоль
Доброго времени суток! Прошу помощи в выводе бинарного дерева на экран (в консоль). Есть шаблон: .

Вывод на консоль бинарного дерева
как сделать вывод на консоль бинарного дерева? struct Node < int d; Node* left; Node*.

Вывод бинарного дерева на экран в виде «дерева»
основная задача: подсчет количества листьев. проблема: при просмотре хочу выводить бин. дерево, в.

Вывод левой ветки бинарного дерева
Здравствуйте, уважаемые форумчане! Вывел левую ветку бинарного дерева на экран, но хотел.

Источник

Вывод бинарного дерева

Нужно написать программу, которая будет выводить дерево на экран. Заготовка есть, дерево уже выводится, но нету стрелочек, которые бы облегчали восприятие дерева(как на картинке). Может, у кого еще есть код печати красивого дерева на Си, очень сильно поможет. Пожалуйста, очень сильно можете.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
#include #include #include 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;i10;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;ip;i++) { printf(" "); } printf("%3d\n", treePtr->data); printTree(treePtr->leftPtr,p+3); } }

Создание бинарного дерева и вывод на экран
Пока не добавил ввод с клавиатуры, тк застрял на ошибках cpp.c:13:17: error: expected ‘;’, ‘,’ or.

Удаление узла бинарного дерева
Бьюсь над задачей битый час, в функцию передаю указатель на узел, который и хотим удалить. И в.

Обход бинарного дерева в ширину
Честное слово, облазил весь интернет и не нашел не одной реально рабочей программы. Сама задача.

Удаление элемента из бинарного дерева
в программе выполняется пару ф-й, не работает удаление элемента (в меню пункт 1), должен удалить.

Костыли из-за отсутствия удобного варианта передачи в функцию динамически изменяющихся строк по значению. Можно расширить p и s до беззнаковых 64 бит — будет выводить деревья глубиной до 64. Или сами думайте как в этом вашем чистом Си передавать в функции строки по значению.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
void showLine(char* c, int p, int s)  int t=s; for(int i=0; ip; i++) {printf(t&1 ? " 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(" if (wood->rightPtr != NULL) { showLine(" }
The numbers being placed in the tree are: 59 53 3 43 51 86 62 24 93 33 Tree: 59 | L: 53 | | | L: 3 | | | R: 43 | | | L: 24 | | | | | R: 33 | | | R: 51 | R: 86 | L: 62 | R: 93

Я понимаю что это большая наглость, но пожалуууйста, можете внедрить это чисто в мой код и кинуть целиком, как оно работает? сдать надо в понедельник, буду безмерно благодарна.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
#include #include #include 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;i10;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    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    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; ip; i++) {printf(t&1 ? " 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(" if (wood->rightPtr != NULL) { showLine(" }

Источник

Читайте также:  Хвойные деревья пирамидальной формы
Оцените статью