#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <malloc.h> #include <locale.h> typedef struct binarytree { int Data; //поле данных int level; 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); } } /*Проверка пустоты дерева*/ 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; } BinaryTree **seek(BinaryTree **p, int l) { int i; if (*p != NULL) { if(l == (*p)->Data) return(p); else if(l < (*p)->Data) return( &(*seek( &((*p)->Left), l ))); else return( &(*seek( &((*p)->Right), l ))); } return 0; } void Vyvod2 (BinaryTree **p, int l) { int i, y; BinaryTree **x; if (*p != NULL) { x = (&(*seek( &((*p)), l ))); printf("%d\n", (*x)->Data); } } int main() { setlocale(LC_ALL, "russian"); 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("%y",&n); Vyvod2(&Root,n); Root=Delete_BinaryTree(Root); if(empty_tree(Root)) printf("\nПамять очищена полностью!\n"); getch(); return 0; } |