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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2011, 18:44   #1
mego4el
Пользователь
 
Аватар для mego4el
 
Регистрация: 19.09.2010
Сообщений: 87
Вопрос бинарное дерево и действия с ним

Здравствуйте, очень нужна помощь разобраться с выполнением функций работы с деревьями, задание такое:

реализовать операции для работы с бинарным деревом:

- создание элемента, узла.
- включение элемента в дерево, по алгоритму двоичного поиска.
- нахождение в дереве узла с заданным значением ключевого признака
- определение макс. глубины дерева
- определение кол-ва узлов дерева
- определение кол-ва листьев дерева
- обход снизу вверх - левое поддерево, правое поддерево, корень.

тип данных - символ.

у меня вроде бы получилось создать дерево, но я не понимаю как реализовать остальные функции, помогите пожалуйста!

Код:
#include <iostream>
using namespace std;

int count=0;
struct bintree
{
	bintree *p1;
	bintree *p2;
	int n;
};
bintree *maketree(int N)
{
	bintree *p;
	p=new bintree;
	count++;
	p->n=count;
	if(N>1)
	{
		p->p1=maketree(n-1);
		p->p2=maketree(n-1);
	}
		return p;
}
int main()
{
	bintree *q;
	q=maketree(4); //naprimer 4 urovnevoe derevo
	cout<<"elements in tree:"<<count<<endl;
	cout<<q->n<<endl;
	cout<<q->p1->n<<endl;
	cout<<q->p1->p1->p1->n<<endl;
	cout<<q->p1->p2->p1->n<<endl;
	cout<<q->p2->n<<endl;
	cout<<q->p2->p1->n<<endl;
	cout<<q->p2->p2->p2->n<<endl;
	return 0;
}
mego4el вне форума Ответить с цитированием
Старый 27.02.2011, 19:04   #2
fizteh
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 46
По умолчанию

Держи код в архиве, там реализован справочник.
Вложения
Тип файла: rar SPR1.rar (975 байт, 16 просмотров)
fizteh вне форума Ответить с цитированием
Старый 01.03.2011, 19:43   #3
mego4el
Пользователь
 
Аватар для mego4el
 
Регистрация: 19.09.2010
Сообщений: 87
По умолчанию

спасибо большое, но все же не понятно как делать это:

Цитата:
- включение элемента в дерево, по алгоритму двоичного поиска.
- нахождение в дереве узла с заданным значением ключевого признака
- определение макс. глубины дерева
- определение кол-ва узлов дерева
- определение кол-ва листьев дерева
- обход снизу вверх - левое поддерево, правое поддерево, корень.
mego4el вне форума Ответить с цитированием
Старый 01.03.2011, 19:45   #4
fizteh
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 46
По умолчанию

Посмотри теорию в презентации.. По-моему там есть код. И вообще второй пункт из твоего списка реализован в моём коде..
Вложения
Тип файла: rar Лекция 07 Структуры данных (стеки, очереди).rar (10.3 Кб, 13 просмотров)
fizteh вне форума Ответить с цитированием
Старый 08.03.2011, 17:39   #5
mego4el
Пользователь
 
Аватар для mego4el
 
Регистрация: 19.09.2010
Сообщений: 87
По умолчанию

Цитата:
Посмотри теорию в презентации.. По-моему там есть код. И вообще второй пункт из твоего списка реализован в моём коде..
спасибо большое, только вот пишет небольшую ошибку при компиляции вашего кода, не могу исправить:

Код:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
#include <stdlib.h> 
const n_str=100;
char names[n_str];
//------------------------------------------------------
struct Node
{
 char fam[n_str];
 int number;
 Node *Left;
 Node *Right;
};
//------------------------------------------------------
void nakl(char *vxod1, char *vxod2)
{
 int i,max;
 max=strlen(vxod2);
 for (i=0;i<=max;i++)
  vxod1[i]=vxod2[i];
 vxod1[strlen(vxod1)]='\0';
 return;
}
//------------------------------------------------------
int srav(char *vxod1,char *vxod2)
{
 int i;
 vxod1=strupr(vxod1);
 vxod2=strupr(vxod2);
 int maxd=strlen(vxod1);
 if (maxd>(strlen(vxod2)))
  maxd=strlen(vxod2);
 for (i=0;i<=maxd;i++)
 {
  if (vxod1[i]>vxod2[i])
  {
   return 1;
  }
   else if (vxod1[i]<vxod2[i])
	 {
	  return -2;
	 }
 }
 if (strlen(vxod2)==strlen(vxod1))
  return 0;
 else return (strlen(vxod1)-strlen(vxod2));

}
//------------------------------------------------------
Node *First(int _tel)
{
 Node *p=new Node;
 nakl(p->fam,names);
 p->number=_tel;
 p->Left=0;
 p->Right=0;
 return p;
}
//------------------------------------------------------
void Found(Node *root)
{
 Node *p=root;
 int found=0;
  while (p && !found)
  { if (srav(names,p->fam)==0)
     {
      found=1;
     }
    else if (srav(names,p->fam) < 0 ) p=p->Left;
    else p=p->Right;
  }
  if (found) printf("%i\n",p->number); else printf("No\n");
  return;
}
//------------------------------------------------------
Node *Insert(Node *root, int _tel)
{ Node *p=root;
  Node *prev;
  int found=0;
  while (p && !found)
  { prev=p;
   if (srav(names,p->fam)==0) found=1;
    else if (srav(names,p->fam) < 0 ) p=p->Left;
    else p=p->Right;
  }
 if (found)
  {
   printf ("Changed. Old value = %i\n",p->number);
   p->number=_tel;
   return p;
  }
 //New Node
 Node *pnew=new Node;
 nakl(pnew->fam,names);
 pnew->number=_tel;
 pnew->Left=0;pnew->Right=0;
 if (srav(names,prev->fam)<0)  prev->Left=pnew;
 else prev->Right=pnew;
 return prev;
 }
//------------------------------------------------------
int main()
{
 system("cls"); 
 int tel;
 printf ("Spravochnik!\n");
 printf ("INSERT - vvod dannix!\n FIND - poisk po familii!\n EXIT - vixod!\n");
 printf ("Pust spravochnik,\n vvedite familiu(EXIT - vixod)\n-> ");
 scanf ("%s",&names);
 if (srav(strupr(names),"EXIT")==0)
  return 0;
 printf ("Vvedite nomer-> ");
 scanf ("%i",&tel);
 Node *root=First(tel);
 do
 {
  printf ("Comanda-> ");
  scanf ("%s",&names);
  if (srav(strupr(names),"INSERT")==0)
   {
    printf ("Vvedite family-> ");
    scanf ("%s",&names);
    printf ("Vvedite nomer-> ");
    scanf ("%i",&tel);
    root=Insert (root,tel);
   }
  if (srav(strupr(names),"FIND")==0)
   {
    printf ("Vvedite family (poisk)-> ");
    scanf ("%s",&names);
    Found(root);
   }
 } while (srav(strupr(names),"EXIT")!=0);
 return 0;
}
ошибка: warning C4018: '>' : signed/unsigned mismatch
mego4el вне форума Ответить с цитированием
Старый 13.03.2011, 12:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ошибка: warning
Где ошибка? Это не ошибка а предупреждение.
Программа рабочая - проверил. Запускается и выходит норм.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.03.2011, 12:26   #7
mego4el
Пользователь
 
Аватар для mego4el
 
Регистрация: 19.09.2010
Сообщений: 87
По умолчанию

вы бы могли прокомментировать код, пожалуйста!
mego4el вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарное дерево С++ Voxa7 Помощь студентам 0 17.05.2010 18:59
Бинарное дерево. amsask Помощь студентам 1 29.04.2010 21:25
Бинарное дерево?? energywav Общие вопросы C/C++ 2 18.12.2009 01:13
Бинарное дерево Lazio Общие вопросы C/C++ 2 10.09.2009 20:31