MisterMyth
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <malloc.h> #include <Windows.h> typedef struct binarytree { int Data; //поле данных binarytree * Left; //указатель на левого потомка binarytree * Right; //указатель на правого потомка } BinaryTree; //создание бинарного дерева void Create(BinaryTree** p, int x) { if(!(*p))//если указатель на корень дерева не равен NULL { BinaryTree* pnew = (BinaryTree*) malloc(sizeof(BinaryTree));// выделяем память pnew->Data = x;//заносим значение pnew->Left = pnew->Right = NULL; *p = pnew; } else { if((*p)->Data> x) Create(&((*p)->Left), x); else Create(&((*p)->Right), x); } } /*Вывод двоичного дерева на экран*/ void Vyvod (BinaryTree **p,int l) { int i; if (*p!=NULL) { Vyvod (&((*p)->Right),l+1); for (i=0; i<l; i++) printf(" "); printf("%d\n",(*p)->Data); Vyvod (&((*p)->Left),l+1); } } void Vyvod2 (BinaryTree **p,int l) { int i; if (*p!=NULL) { printf("%d\n",(*p)->Data); } } /*Проверка пустоты дерева*/ bool empty_tree(BinaryTree * Node) { if(Node==NULL) return true; else return false; } //освобождение памяти, выделенной под бинарное дерево BinaryTree* Delete_BinaryTree(BinaryTree* Node){ if (Node != NULL) { Delete_BinaryTree(Node->Left); Delete_BinaryTree(Node->Right); free(Node); } return NULL; } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int i,n,temp, k; BinaryTree * Root; Root=NULL; printf("Число элементов дерева\t"); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&temp); Create(&Root,temp); } Vyvod(&Root,0); if(empty_tree(Root)) { printf("\nДерево пусто!\n"); getch(); return 0; } printf("Какой уровень выводим\t"); scanf("%d",&n); Vyvod2(&Root, n); Root=Delete_BinaryTree(Root); if(empty_tree(Root)) printf("\nПамять очищена полностью!\n"); getch(); return 0; } | Нужно чтобы выводило указанный уровень. У меня выводит лишь корень. Ответ преподавателя: Как я понимаю, функция Vivid2 печатает всегда только 0 уровень. И это логично, так как у Вас в теле функции не реализован поиск требуемого уровня по вводимому номеру n. Например вот такая функция, она рекурсивно ищет требуемый уровень дерева и считает на нем количество узлов. //подсчет количества узлов на уровне void countNode(Node *t, int u, int a, int &cont) { if (t == NULL) return; //если дерево пустое - выход else //Иначе { countNode(t->l, ++u, a, cont);///просматриваем левое поддерево if (u == a) cont++; //если номер уровня равен искомому увеличиваем счетчик количества узлов u--; } countNode(t->r, ++u, a, cont);//просматриваем правое поддерево } |