Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2011, 22:04   #1
alexande-rus
Новичок
Джуниор
 
Регистрация: 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;
}
alexande-rus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск двоичного дерева 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