本帖最后由 psp_66 于 2012-06-02 15:04:39 编辑

解决方案 »

  1.   

    你对应行号,看看那里的对象引用是否 为null.有则改之 无则加勉。
      

  2.   

    Debug后还是改不对继续求帮忙
      

  3.   

    if(lh < rh){ // 右の子が高い
                AVL_Node  A=p,B=p.right;
                AVL_Node  X=A.left,   Y=B.left,   Z=B.right;
                if(rlh<rrh){ // 右の右の孫が高い:1重回転
                    B.left=A;   A.right=Y; 
                    A.h=lh+1; 
                    return B;
                } else {//右の左の孫が高い:2重回転
                AVL_Node  C=Y,   Y1=C.left,   Y2=C.right;//这行
                        C.left=A; C.right=B; A.right=Y1; B.left=Y2;
                        A.h=lh+1;   B.h=rrh+1;   C.h =A.h+1;
                        return C;
                    }
               
                }
    好好看看你这段代码,其实你的p.right里面的right和left都是空的,
    所以b的right和left都是空的,
    所以Y是空的
    所以C是空的
    所以 Y1=C.left,   Y2=C.right当然会抛空指针
      

  4.   

    但是不会改    劳驾帮改下求AVL树的高。
      

  5.   


    if(lh < rh){ // 右の子が高い
    AVL_Node  A=p,B=p.right;
    AVL_Node  X=A.left,   Y=B.left,   Z=B.right;
    if(rlh<rrh){ // 右の右の孫が高い:1重回転
    B.left=A;   A.right=Y; 
    A.h=lh+1; 
    return B;
    } else {//右の左の孫が高い:2重回転
    AVL_Node  C=Y,   Y1=C.left,   Y2=C.right;
    C.left=A; C.right=B; A.right=Y1; B.left=Y2;
    A.h=lh+1;   B.h=rrh+1;   C.h =A.h+1;
    return C;
    }
       
    }else{

    AVL_Node     A=p,  B=p.left;
    AVL_Node     X=B.left, Y=B.right, Z=A.right;
    if(llh>lrh){/* 左の左の孫が高い:1重回転*/
    B.right=A;  A.left=Y;
    A.h=rh+1; 
    return B;
    } else {/*左の右の孫が高い:2重回転*/
    AVL_Node   C=Y,  Y1=C.left, Y2=C.right;
    C.left=B; C.right=A;  B.right= Y1; A.left=Y2;
    B.h=llh+1;  A.h=rh+1;  C.h=B.h+1;
    return C; }
    }
    这样就好