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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2016, 09:34   #1
ShuricFC
Пользователь
 
Регистрация: 17.09.2016
Сообщений: 25
По умолчанию Сбалансированность бинарного дерева

Здравствуйте, помогите пожалуйста исправить ошибку в коде. Нужно проверить дерево на сбалансированность. Не на все данные выдает правильный результат, например 1 2 3 0 дерево не сбалансировано, а выдает результат YES.
Код:
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("input.txt");
ofstream f1("output.txt");
typedef struct Binary_Tree* Tree;
struct Binary_Tree
{
	int info; 
	Binary_Tree *left, *right;
};

Binary_Tree * tree = NULL; 
void push(int a, Binary_Tree **t)
{
	if ((*t) == NULL) 
	{
		(*t) = new Binary_Tree; 
		(*t)->info = a; 
		(*t)->left = (*t)->right = NULL; 
		return;
	}
	if (a>(*t)->info) push(a, &(*t)->right); 
	else push(a, &(*t)->left); 
}
int maxDepth(Binary_Tree* root) {
	if (!root) {
		return 0;
	}
	return  max(maxDepth(root->left), maxDepth(root->right));
}

int minDepth(Binary_Tree* root) {
	if (!root) {
		return 0;
	}
	return  min(minDepth(root->left), minDepth(root->right));
}

void isBalanced(Binary_Tree* root) {
	if (maxDepth(root) - minDepth(root) <= 1)
		f1 << "YES";
	else
		f1 << "NO";

}
int main()
{
	int n;
	Tree t=NULL;
	Binary_Tree* root = NULL;
	while (f >> n && n != 0)
	{
		Tree tmp = new Binary_Tree();
		push(n, &tree);
	}
	isBalanced(root);
}
ShuricFC вне форума Ответить с цитированием
Старый 25.10.2016, 16:22   #2
Zams
Пользователь
 
Аватар для Zams
 
Регистрация: 25.10.2016
Сообщений: 15
По умолчанию

Код:
#include <cmath>
 
int check( node *h )
{
    if ( h == 0 ) return 1;
 
    int l = check( h->left );
    int r = check( h->right );
 
    if ( l == 0 || r == 0 ) return 0;
    if ( std::abs( l - r ) > 1 ) return 0;
    return ( l + r + 1 ) / 2 + 1;
}
Проверяет сбалансированность как в АВЛ-дереве, где высота поддеревьев может отличаться на 1.
Если функция вернет 0, то дерево не сбалансировано.
Корректность работы функции не проверял
Zams вне форума Ответить с цитированием
Старый 26.10.2016, 08:04   #3
ShuricFC
Пользователь
 
Регистрация: 17.09.2016
Сообщений: 25
По умолчанию

Скорее всего у меня проблема с передачей параметров в функцию.
Код:
int main()
{
	int n;
	Tree t=NULL;
	Binary_Tree* root = NULL;
	while (f >> n && n != 0)
	{
		Tree tmp = new Binary_Tree();
		push(n, &tree);
	}
	isBalanced(root);
}
Не подскажите в чем проблема?
ShuricFC вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение бинарного дерева Kallis Общие вопросы C/C++ 0 17.12.2013 03:56
преобразование бинарного дерева Lerris Общие вопросы C/C++ 0 09.03.2012 21:12
Построение бинарного дерева LordAlex91 Общие вопросы C/C++ 2 18.02.2012 15:49
Высота бинарного дерева m9yt Общие вопросы C/C++ 5 13.03.2010 22:17
создание бинарного дерева zetrix Паскаль, Turbo Pascal, PascalABC.NET 2 30.11.2006 19:32