Реализация AVL Tree - PullRequest
       12

Реализация AVL Tree

0 голосов
/ 28 февраля 2012

вот мой код для реализации AvlTree, но есть одна ошибка, когда я запускаю, он говорит сбой во время выполнения: P не инициализирован, и как исправить мой код?вот оно

#include "avltree.h";
#include "fatal.h";
//#include<iostream>
#include<stdlib.h>
//using namespace std;
struct AvlNode
{
    ElementType Element;
    AvlTree left;
    AvlTree right;
    int Height;
    };
AvlTree MakeEmpty(AvlTree T)
{

    if (T!=NULL)
    {
        MakeEmpty(T->left);
    MakeEmpty(T->right);
    free(T);
}
     return NULL;
}
Position Find(ElementType X,AvlTree T)
{
    if (T==NULL)
         return NULL;
    if (X<T->Element)
        return Find(X,T->left);
    else
        if (X>T->Element)
            return Find(X,T->right);
        else
            return T;
    }
Position FindMin(AvlTree T)
{

      if (T==NULL)
           return NULL;
      else
          if (T->left=NULL)
              return T;
          else
              return FindMin(T->left);


}

Position FindMax(AvlTree T){
     if(T!=NULL)
         while(T->right!=NULL)
             T=T->right;
     return T;





}

static int Height(Position P)
{
    if (P==NULL)
         return -1;
    else 
        return P->Height;


}

static int Max(int Lhs,int Rhs){
     return Lhs>Rhs?Lhs:Rhs;

}



static Position rotateleft(Position K2)

{

    Position K1;
    K1=K2->left;
    K2->left=K1->right;
    K1->right=K2;
    K2->Height=Max(Height(K2->left),Height(K2->right))+1;
    K1->Height=Max(Height(K1->left),K2->Height)+1;
    return K1;
    }
static Position rotateright(Position K1)
{

    Position K2;
    K2=K1->right;
    K1->right=K2->left;
    K2->left=K1;
    K1->Height=Max(Height(K1->left),Height(K1->right))+1;
    K2->Height=Max(Height(K2->right),K1->Height)+1;
    return K2;




}
static Position DoubleLeft(Position K3)
{
    K3->left=rotateright(K3->left);
    return rotateleft(K3);



}

static Position DoubleRight(Position K1){

    K1->right=rotateleft(K1->right);
    return rotateright(K1);


}
AvlTree Insert(ElementType X,AvlTree T)
{

    if (T==NULL)
    {

        T=(AvlNode*)malloc(sizeof(struct AvlNode));
        if (T==NULL)
            FatalError("Out of space");
        else
        {

            T->Element=X;T->Height=0;
            T->left=T->right=NULL;



        }



    }
    else
        if (X<T->Element)
        {

            T->left=Insert(X,T->left);
            if (Height(T->left)-Height(T->right)==2)
                if (X<T->left->Element)
                    T=rotateleft(T);
                else
                    T=DoubleLeft(T);
                    }

        else
            if (X>T->Element)
            {
                T->right=Insert(X,T->right);
    if(Height(T->right)-Height(T->left)==2)
        if(X>T->right->Element)
            T=rotateright(T);
        else
            T=DoubleRight(T);
}


            T->Height = Max( Height( T->left ), Height( T->right ) ) + 1;
 return T;


}
AvlTree Delete( ElementType X, AvlTree T )

{
    printf( "Sorry; Delete is unimplemented; %d remains\n", X );

    return T;


}
ElementType Retrieve(Position P)

{
    return P->Element;

}

int main(){

    AvlTree T;
    Position P;
    int i;
    int j=0;
    T=MakeEmpty(NULL);
    for (i=0;i<50;i++,j=(j+7)%50)
        T=Insert(j,T);
    for (i=0;i<50;i++)
        if (P==Find(i,T)==NULL || Retrieve(P)!=i)
             printf( "Error at %d\n", i );

    printf( "Min is %d, Max is %d\n", Retrieve( FindMin( T ) ),
 Retrieve( FindMax( T ) ) );
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 28 февраля 2012

Вы не включили файл "avltree.h", поэтому никто не может скомпилировать этот код.

Однако есть одна ошибка, которая выделяется:

if (P==Find(i,T)==NULL || Retrieve(P)!=i)
     ^^ this is not an assignment

Я думаю, что вы хотели:

if ((P=Find(i,T))==NULL || Retrieve(P)!=i)
2 голосов
/ 28 февраля 2012

Я думаю, что это проблема:

if (P==Find(i,T)==NULL || Retrieve(P)!=i)

, поскольку P не назначается и не было инициализировано, поэтому P не будет NULL, означая, что первое условие вернет false, а Retrieve() будет вызвано с неинициализированным P.

Должно быть:

if ( (P = Find(i,T)) == NULL || Retrieve(P)!=i)
2 голосов
/ 28 февраля 2012

Я считаю, что ошибка в том, что вы использовали double = здесь:

 if (P==Find(i,T)==NULL || Retrieve(P)!=i)
    printf( "Error at %d\n", i );

Идея состоит в том, чтобы P сохранял значение Find, верно?

1 голос
/ 28 февраля 2012
int main(){

    AvlTree T ();
    Position P ();
...