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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2012, 15:01   #1
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию бинарное дерево с прямым обходом

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

Код:
#include <iostream>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
template<class T> struct vertex
{
	T value;
	vertex* left;
	vertex* right;
};
 
template<class T> void insert(vertex<T>* head, T element)
{
	if(head->value == element) 
		return;
	else
	{
		if(head->value < element)
		{
			if(head -> left == NULL)
			{
				head -> left = new vertex<T>;
				head -> left -> value = element;
				head -> left -> left = NULL;
				head -> left -> right = NULL;
			}
			else
			{
				head = head->left;
				insert(head,element);
			}
		}
		else
			if(head->value > element)
			{
				if(head -> right == NULL)
				{
					head -> right = new vertex<T>;
					head -> right -> value = element;
					head -> right -> left = NULL;
					head -> right -> right = NULL;
				}
				else
				{
					head = head->right;
					insert(head,element);
				} 
			}
	}
}

template<typename T> int find (vertex<T>* head, T element, int *l)
{
	if(head==NULL)
	{
		*l=0;
		return *l;
	}
	if(head->value==element) 
		return *l;
	if (head->left) 
	{
		*l+=1;
		find(head->left, element, l);
	}
	if (head->right) 
	{
		l+=1; 
		find(head->right, element, l);
	}
}
 
template<typename T> void show_bin_tree (vertex<T>* head, int n) 
{ 
	if (head->left) 
		show_bin_tree(head->left, n+1); 

	for (int i = 0; i < n; i++) 
		cout << " "; 
	cout << head->value << '\n'; 
	
	if (head->right) 
		show_bin_tree(head->right, n+1); 
}
 
int main()
{
	cout<<"programma postroinia binarnogo dereva\n"<<endl;
	cout<<"c ego pramim obxodom"<<endl;
	vertex<char>* head = new vertex<char>;
	head->left = NULL;
	head->right = NULL;
	srand(time(NULL));
	head->value = (char)(rand()%('z'-'a')+'a');
	
	const int max=9;
	char arr[max], chr; int n=0;
	bool b;
	
	while (n<9)
	{
		b=true;
		chr=(char)(rand()%('z'-'a')+'a');
		for (int i=0; i<=n; i++)
			if (arr[i]==chr)
				b=false;
		if (b)
		{
			arr[n]=chr;
			++n;
		}
	}
	
	for(int i = 0; i<9; i++)
		insert(head,arr[i]);
 
	cout << endl;
	int l=0;
	cout << "viviod dereva\n"<<endl;
	show_bin_tree (head, l);
	cout << "vvidite iskomii simvol" <<endl;
	char ch;
	cin >> ch;
 
	if(find(head, ch, &l))
		cout << "Element found " << l;
	else 
		cout << "Element not found";
 
	system("pause");
	return 0;
}
вот что есть. как бы мне исправить код подскажите?
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.

Последний раз редактировалось Вечный_студент; 27.05.2012 в 15:22.
Вечный_студент вне форума Ответить с цитированием
Старый 27.05.2012, 16:13   #2
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

Что именно неправильно у Вас? не строит дерево? не находит элемент? или что?
alezha вне форума Ответить с цитированием
Старый 27.05.2012, 16:17   #3
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

не ищет элемент

и дерево не сбалансированное. судя по всему строит только 1 ветку(или я ошибаюсь)
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 27.05.2012, 16:23   #4
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

на первом курсе писал лабу по дереву. Думаю поможет.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
struct der
{
	int inf;
	der *l,*r; // указатель на левое и правое поддерево
};
void del(der **,int );
der *sozd(der *);
void add(der *);
void out_tree(der *, int );
void inorder(struct der *);
void main(void)
{
	setlocale(LC_ALL,"Russian");
	der *dr;
	dr=NULL; // адрес корня бинарного дерева
	system("cls");
	int st;
	do
	{
		while(1)
		{
			puts("вид операции: \n 1-создать дерево");
			puts(" 2-Обойти дерево в симметричном порядке");
			puts(" 3-Вывод в виде перевернутого дерева");
			puts(" 4-добавление элементов в дерево");
			puts(" 5-удаление любого элемента из дерева");
			puts(" 6-выход");
			fflush(stdin);
			switch(getch())
			{
			case '1': dr=sozd(dr); break;
			case '2': inorder(dr); break;
			case '3': out_tree(dr,0); getch(); break;
			case '4': add(dr); break;
			case '5': 
				printf("\n Введите число для удаления");
	fflush(stdin);
	scanf("%d",&st);
	del(&dr,st);   break;
			case '6': return;
			}
			system("cls");
		}
		printf("Повторить y/n");
		fflush(stdin);
	}
	while(getch()=='y');
}
der *sozd(der *dr)  // создание бинарного дерева
{
	if (dr)
	{
		puts("Бинарное дерево уже создано");
		return (dr);
	}
	if (!(dr=(der*)calloc(1,sizeof(der))))
	{
		puts("Нет свободной памяти");
		getch();
		return NULL;
	}
	puts("Введите информацию в корень дерева");
	fflush(stdin);
	scanf("%d",&dr->inf);
	return dr;
}
void add(der *dr)  // функция добавления узлов в бинарное дерево
{
	der *dr1,*dr2;
	int k; // результат сравнения двух строк
	int ind, st;
	if (!dr)
	{
		puts("Нет корня дерева \n");
		getch();
		return;
	}
	do
	{
		puts("Введите информацию в очередной узел дерева (0 - выход)");
		fflush(stdin);
		scanf("%d",&st);
		if(!st) return; // выход в функцию main
		dr1=dr;
		ind=0; // 1 - признак выхода из цикла поиска
		do
		{
			if(!(k=st-dr1->inf))
				ind=1; // для выхода из цикла do ... while
			else
			{
				if (k<0) // введ. строка < строки в анализируемом узле
				{
					if (dr1->l) dr1=dr1->l; // считываем новый узел дерева
					else ind=1; // выход из цикла do ... while
				}
				else // введ. строка > строки в анализируемом узле
				{ 
					if (dr1->r) 
						dr1=dr1->r; // считываем новый узел дерева
					else ind=1; // выход из цикла do ... while
				}
			}
		}
		while(ind==0);
		if (k) // не найден узел с аналогичной информацией
		{
			if (!(dr2=(struct der *) calloc(1,sizeof(struct der))))
			{
				puts("Нет свободной памяти");
				return;
			}
			if (k<0) dr1->l=dr2; // ссылка в dr1 налево
			else dr1->r=dr2; // ............ направо
			dr2->inf=st; // заполнение нового узла dr2
		}
	}
	while(1); // любое условие т.к. выход из цикло по return
}
void del(der **dr,int st)  // функция удаления узла дерева
{
	if(!*dr)
	{
		printf("\n Дерево пустое");
		return;
	}
	if(st<(*dr)->inf) del(&(*dr)->l,st);
	else if(st>(*dr)->inf) del(&(*dr)->r,st);
	else 
	{
		der *lt, *rt;
		lt=(*dr)->l;
		rt=(*dr)->r;
		free(*dr);
		*dr=rt;
		while(*dr)
			dr=&(*dr)->l;
		*dr=lt;
	}
}
void out_tree(der *dr1, int level) 
{
	if(dr1)							//пока dr не равен нулю
	{
		out_tree(dr1->r,level+1);
		for(int i=0; i<level; i++)	//обозначение уровня
			printf("        ");
		printf("   ____\n");
		for(int i=0; i<level; i++)
			printf("        ");
		printf("->| %2d |\n",dr1->inf);
		for(int i=0; i<level; i++)
			printf("        ");
		printf("  |____|\n");
		out_tree(dr1->l,level+1);
	}
	
}
void inorder(struct der *root)
{
  if(!root) return;
  inorder(root->l);
  if(root->inf) printf("%d", root->inf);
  inorder(root->r);
}
alezha вне форума Ответить с цитированием
Старый 27.05.2012, 16:27   #5
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

как в консоле язык русский подключить?) плохо транслитом
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 27.05.2012, 16:29   #6
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

У меня же все прописано.
Код:
setlocale(LC_ALL,"Russian");
alezha вне форума Ответить с цитированием
Старый 27.05.2012, 16:33   #7
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

MV C++ 2006 не работает почему то О_о
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 27.05.2012, 16:40   #8
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

CharToOem попробуйте. А лучше поставьте новую версию Visual Studio.

Последний раз редактировалось alezha; 27.05.2012 в 16:43.
alezha вне форума Ответить с цитированием
Старый 27.05.2012, 16:45   #9
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

Код:
char s[]="Привет всем!";
CharToOem(s,s);
printf("%s\n", s);
так?

и еще такой вопрос. Что изменить, чтобы в дерево можно было записывать буквы?
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 27.05.2012, 16:48   #10
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

вроде так.
и для строк:
Код:
struct der
{
	char inf[];
	der *l,*r; // указатель на левое и правое поддерево
};
alezha вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бинарное дерево NewNub Общие вопросы Delphi 1 05.12.2011 15:10
Бинарное дерево С++ Dfoer Фриланс 1 02.12.2011 12:49
бинарное дерево Lucefer2007 Общие вопросы C/C++ 0 17.04.2011 14:31
бинарное дерево С++ mego4el Помощь студентам 0 15.03.2011 20:47
Бинарное дерево lubafffka Общие вопросы C/C++ 0 29.04.2009 12:28