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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2012, 23:05   #1
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию Бинарное дерево (С++)

Помогите пожалуйста.
В книге Павловской по С++
код приведенный ниже должен вывести в итоге
Код:
      1
   6
      8
10
      20
          21
   25
      30
а у меня только 10 1 30

Код:
#include<iostream>
using namespace std;
struct Node{
		int d;
		Node *left;
		Node *right;
};
	Node * first(int d);
	Node * search_insert(Node *root, int d);
	void print_tree(Node *root, int l);

int main(){
	setlocale(LC_ALL, "RUS");
	int b[]={10, 25, 20, 6, 21, 8, 1, 30};
	Node *root = first(b[0]);
	for (int i=1; i<8; i++) search_insert(root, b[i]);
	print_tree(root, 0);

	system("Pause >> void");
	return 0;
}

Node * first(int d){
	Node *pv = new Node;
	pv->d = d;
	pv->left = 0;
	pv->right=0;
	return pv;
}

Node * search_insert(Node *root, int d){
	Node *pv=root, *prev;
	bool found = false;
	while (pv && !found){
		prev = pv;
		if		(d==pv->d) found = true;
		else if (d<pv->d) pv	= pv->left;
		else				  pv	= pv->right;
	}
	if (found) return pv;
	Node *pnew = new Node;
		pnew->d = d;
		pnew->left = 0;
		pnew->right=0;
	if (d < pnew->d) prev->left = pnew;
	else prev->right = pnew;
	return pnew;
}

void print_tree(Node *p, int level){
	if (p){
		print_tree(p->left, level+1);
		for (int i=0; i<level; i++) cout << "     ";
		cout << p->d << endl;
		print_tree(p->right, level + 1);
	}
}
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 05.08.2012, 01:04   #2
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

изменил одну функцию, но после изменения не выводит число 21
Код:
Node * search_insert(Node *root, int d){
	Node *proot=root, *posro;	
	while((d>proot->d && proot->left) || (d < proot->d && proot->right) || (d==proot->d)) {
		if (d>proot->d) 
			proot=proot->left;
		 else if (d<root->d) 
			 proot=proot->right;
		 else return proot;
	}
	Node *pnew = new Node;
	pnew->d = d;
	pnew->left = 0;
	pnew->right = 0;
	
	if (d>proot->d) proot->left=pnew;  
	if (d<proot->d) proot->right=pnew;
	return pnew;

}
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 05.08.2012, 06:11   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

в коде с первого поста ошибка тут:
Код:
pnew->d = d;
//...
if (d < pnew->d) prev->left = pnew;
Что-то еще правил:
Код:
#include<iostream>
using namespace std;
//! 
struct Node{
		int d;
		Node *left;
		Node *right;
};
//! 
Node * first(int d);
Node * search_insert(Node *root, int d);
void print_tree(Node *root, int l);
//! 
int main(){
	setlocale(LC_ALL, "RUS");
	int b[]={10, 25, 20, 6, 21, 8, 1, 30};
	Node *root = first(b[0]);
	for (int i=1; i<8; i++) search_insert(root, b[i]);
	print_tree(root, 0);

	std ::cin.get(), std ::cin .get();
	return 0;
}
//! 
Node * first(int d){
	Node *pv = new Node;
	pv->d = d;
	pv->left = 0;
	pv->right=0;
	return pv;
}
//! 
Node * search_insert(Node *root, int d){
	Node *pv=root, *prev;
	bool found = false;
	while (pv && !found){
		prev = pv;
		if (d==pv->d) found = true;
		else if (d<pv->d) pv = pv->left;
		else pv	= pv->right;
	}
	if (found) return pv;
	Node *pnew = new Node;
	
	pnew->d = d;
	pnew->left = 0;
	pnew->right=0;
	
	if (d < prev->d) prev->left = pnew;
	else prev->right = pnew;
	return pnew;
}
//! 
void print_tree(Node *p, int level){
	if( 0 == p )
		return;
	print_tree(p->left, level+1);
	for (int i=0; i<level; i++) 
		cout << "    ";
	cout << p->d << endl;
	print_tree(p->right, level + 1);
}
rrrFer вне форума Ответить с цитированием
Старый 05.08.2012, 11:42   #4
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Цитата:
в коде с первого поста ошибка тут:
Код:
pnew->d = d;
//...
if (d < pnew->d) prev->left = pnew;
Спасибо, все работает теперь
Человек
Артём Волжанкин вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарное дерево newslayer Общие вопросы C/C++ 0 30.05.2012 11:59
бинарное дерево NewNub Общие вопросы Delphi 1 05.12.2011 15:10
Бинарное дерево С++ Dfoer Фриланс 1 02.12.2011 12:49
Бинарное дерево DTroy Visual C++ 1 22.11.2011 21:09
бинарное дерево СИ Anastasia.K Помощь студентам 0 31.10.2009 18:16