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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 22:19   #1
Сайын
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 20
По умолчанию Дерево.Удалить все узлы больше среднего арифметического

1.Создать дерево.2.Найти среднее арифметическое узлов(чисел). 3.Удалить все узлы больше среднего арифметического.
Все работает кроме последнего.
Код:
// dim.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
#include <iostream>

using namespace std;
#define tree struct tree
tree
{tree *left; float key; tree *right;};

tree *t1, *q;

void insert(tree **S,tree *X)//добавление
{if (*S==0)
   {*S=new tree;
	(*S)->key=X->key;
	(*S)->left=(*S)->right=0;
   }
 else 
     {if (X->key<(*S)->key)
	  insert(&(*S)->left,X);
	 else if (X->key>(*S)->key)
		 insert(&(*S)->right,X);
	}
}
void show(tree *s) //просмотр
{if(s)
	{show(s->left);
	 show(s->right);
	 printf(" %4.0f", s->key);
	}
}
void delet(tree **S1)
{if ((*S1)->right!=0)
	delet(&(*S1)->right);
else 
	{q->key=(*S1)->key;
	 q=(*S1)=(*S1)->left;
	}
}
void del(tree **S, tree *X)//удаление узла Х 
{if ((*S)!=0)
	{if (X->key<(*S)->key)
		del(&(*S)->left,X);
	else if(X->key>(*S)->key)
			del(&(*S)->right,X);
		 else {q=*S;
			   if (q->right==0)
			   (*S)=q->left;
			   else if (q->left==0)
						(*S)=q->right;
					else delet(&q->left);
		/*free q;*/}
	}
}
int sum(tree *s)//сумма
{if (s)
	{return sum(s->left)+sum(s->right)+s->key;}
else return 0;
}int number=0;
void numb(tree *s)
{if(s)	
	{numb(s->left); 
	number=number+1; 
	numb(s->right);
	}//счетчик кол-во узлов
}
float middle, a;
void mid(tree *s)//среднеее арифметическое
{if(s)
	{mid(s->left); 
	mid(s->right); 
	a=s->key/number; 
	middle=middle+a;}
}
void cln(tree *s) //нахождение и удаление узлов больше среднего
{if(s)
	{cln(s->left);
	cln(s->right);
	if(s->key>middle)
		del(&s, s);
	}
}
/*int cln(tree *s)
{if(s->right)
	{	if(s->key>middle)
		{del(&s, s);}
	 return cln(s->right);
	}
else if(s->left)
	{	if(s->key<middle)
		{del(&s, s);}
	 return cln(s->left);
	}
}*/
int i, a1;
int _tmain(int argc, _TCHAR* argv[])
{printf("Vvedite 6 elementov: \n");
 tree *t2=new tree;
 for (i=1; i<=6;i++)
	{scanf("%d",&a1);t2->key=a1;
	insert(&t1,t2);
	}
	show(t1);
	numb(t1);
	mid(t1);
	printf("\nsred= %3.2f\n",middle);t2->key=4;
	cln(t1);printf("\nsred= %3.2f\n",middle);del(&t1,t2);
	show(t1);printf("\n");
return 0;
}
Сайын вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отклонение от среднего арифметического KOLANICH Помощь студентам 3 24.10.2011 18:40
С++. Подсчёт среднего арифметического Negent Помощь студентам 1 15.08.2010 14:00
Поиск среднего арифметического в массиве Джед Общие вопросы C/C++ 15 12.06.2009 16:32
Нахождение среднего арифметического AliVe Паскаль, Turbo Pascal, PascalABC.NET 1 12.04.2007 00:25