Автор |
Сообщение |
Shining ninja Гуру |
|
Значит проблема вот в чем когда я забиваю последовательными числами два дерева(BST и AVL) - то прога валится - помогите плиз...
void main( )
{
locale::global(locale("rus"));
BSTree <long int,long int> BSTree_int; //Создаем BST-дерево
AVLtree <long int,long int> AVLree_int; //Создаем AVL-дерево
......................................
case 2:
{
system("cls");
long int k=0,test=0,tes=0,bins=0,bdel=0,bfin=0,ains=0,adel=0,afin=0;
cout<<"Введите размер дерева: "<<endl;
cin>>test;
long int inf=0, val=0;
long int *M=NULL;
M=new long int[test];
for(k=1; k<test; k++)
{
BSTree_int.InsertB(1,k);
AVLree_int.InsertA(1,k,0);
M[k]=k;
}
..........................
я их забиваю для того чтобы протестить прогу
вот сами вставки:
Elem_BSTree *InsertBST (Elem_BSTree *n,T d,T1 k) //Включение данных с заданным ключом
{
count++;
if (root)
{
if (n==NULL) {n=new Elem_BSTree(d,k);hi=true;return n;}
if (k==n->key) return n;
if (k<n->key) n->left=InsertBST(n->left,d,k);
else n->right=InsertBST(n->right,d,k);
}
else
{
root=new Elem_BSTree(d,k);
hi=true;
}
return n;
}
bool InsertAVL(Elem_BSTree *&n,T d,T1 k,bool h) //Вставка в AVL-дерево
{
Elem_BSTree *p1;
Elem_BSTree *p2;
count++;
if (n==NULL) // Включение
{
n=new Elem_BSTree(d,k);
h=true;hi=true;
n->bal=0;
}
else if (k<n->key) // Поиск слева
{
h=InsertAVL(n->left,d,k,h);
if (h) // Выросла левая ветвь
switch (n->bal)
{
case 1: n->bal=0;h=false;break;
case 0: n->bal=-1;break;
case -1: // Балансировка
p1=n->left;
if (p1->bal==-1) // Однократный поворот вправо
{
n->left=p1->right;p1->right=n;n->bal=0;n=p1;
}
else // Двойной поворот: влево, вправо.
{
p2=p1->right;
p1->right=p2->left;
p2->left=p1;
n->left=p2->right;
p2->right=n;
// Коррекция баланса
if (p2->bal==-1) n->bal=1; else n->bal=0;
if (p2->bal==1) p1->bal=-1; else p1->bal=0;
n=p2;
}
n->bal=0;h=false;
break;
}
}
else if (k>n->key) // Поиск справа (при равенстве возможно одинаковые элементы)
{
h=InsertAVL(n->right,d,k,h);
if (h) // Выросла правая ветвь
switch (n->bal)
{
case -1: n->bal=0;h=false;break;
case 0: n->bal=1;break;
case 1: // Балансировка
p1=n->right;
if (p1->bal==1) // Однократный поворот влево
{
n->right=p1->left;p1->left=n;n->bal=0;n=p1;
}
else // Двойной поворот: вправо, влево
{
p2=p1->left;
p1->left=p2->right;
p2->right=p1;
n->right=p2->left;
p2->left=n;
// Коррекция баланса
if (p2->bal==1) n->bal=-1; else n->bal=0;
if (p2->bal==-1) p1->bal=1; else p1->bal=0;
n=p2;
}
n->bal=0;h=false;
break;
}
}
return h;
} |
|
|
|
|
|
Аватары: Вкл|Выкл ЮзерИнфо: Вкл|Выкл Подписи: Вкл|Выкл
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы
|
|