|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.04.2011, 22:04 | #1 |
Новичок
Джуниор
Регистрация: 13.04.2011
Сообщений: 1
|
n-мерное дерево из двоичного дерева
Задание - Найти все поддеревья, листья которых находятся в заданном диапазоне высот от корня поддерева
Есть код программы, реализующий её с помощью двоичного дерева. Но я никак не могу реализовать её с помощью n-мерного дерева. Прошу помощи в реализации=) Код: #include "stdafx.h" #include <iostream> #include <conio.h> #include<stdio.h> using namespace std; struct tree { int zn; tree *l,*r; }; struct tree *create(struct tree *,int); int search(struct tree *,int,int,int); void delet(struct tree *); void print(struct tree *,int); int main() { int n,len=0,m1,m2,level=0; //m1 m2-диапазон //level-уровень, нужен чтоб выводить дерево "красиво" //len- тож типа уровня для того чтобы считать диапазон //tr->r-правая ветка дерева //tr->l-левая ветка дерева //tr->zn-значение //sch,er-счетчики, если вершина входит в диапазон, то sch=1, // и sch*er=1 тоже, и мы печатаем вершину, если не входит, то sch=0 //и ниче не печатаем struct tree *Tr=NULL; FILE *f; char name[255]; printf("\n Name of file: "); scanf("%s",&name); while(fopen(name,"r")==NULL) //проверка существования файла с данным именем { printf("File with this name exists\n\Name of file: "); scanf("%s",&name); } f=fopen(name,"r"); n=getc(f); while(n!=EOF) { Tr=create(Tr,n-48); n=getc(f); } fclose(f); cout<<"Enter the range - "; cin>>m1>>m2; cout<<"\n Tree: "<<endl; print(Tr,level+1); cout<<"\n\n Subtrees:\n"; n=search(Tr,len,m1,m2); getch(); delet(Tr); return 1; } struct tree *create(struct tree *tr,int n) { if(!tr) { tr=new struct tree; tr->zn=n; tr->l=tr->r=NULL; } if(n>tr->zn) tr->r=create(tr->r,n); if(n<tr->zn) tr->l=create(tr->l,n); return tr; } void print(struct tree *tr,int level) { if(tr) { print(tr->l,level+1); for(int i=0;i<level;i++) cout<<" "; cout<<tr->zn<<endl; print(tr->r,level+1); } return; } int search(struct tree *tr,int len,int m1, int m2) { int sch=1, er=1, level=1; if(tr) { sch=0; //зануляем счетчик er=search(tr->l,len+1,m1,m2); //рекурсивно вызываем фунцию что пройти до конца по левой ветке // если ничего не нашли в er 0 if(len>=m1 && len<=m2) //если вершина вошла в диапазон sch+=1; //sch=1 len+=1; //переходим на след уровень sch*=er; //проверка, есть ли вершины в этом диапазоне er=search(tr->r,len,m1,m2); //тоже самое по правой ветке if(sch*er==1) //если вершины найдены то печатаем их { print(tr,level+1); cout<<"\n"; } } len-=1; return sch*er; } void delet(struct tree *tr) { int level=1; if (tr == NULL) cout <<"The tree is empty \n"; else { print(tr->l,level+1); print(tr->r,level+1); if (tr->r != NULL) delet(tr->r); if (tr->l != NULL) delet(tr->l); } return; } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск двоичного дерева | mtg | Общие вопросы C/C++ | 2 | 01.12.2010 21:15 |
Обход двоичного дерева слева | Дядя Тёма | Фриланс | 2 | 22.06.2010 17:02 |
Обход двоичного дерева слева | Дядя Тёма | Помощь студентам | 0 | 05.06.2010 18:25 |
Обход двоичного дерева | F1nk | Помощь студентам | 0 | 03.06.2010 17:51 |
дерево двоичного поиска(С++) | 1mposs1ble | Помощь студентам | 0 | 07.05.2010 16:05 |