2012-12-18 32 views
1

我有一個數據二叉樹從一個簡單的列表,現在我需要平衡,但它不斷給我的錯誤「分段錯誤(核心轉儲)」通過旋轉ANSI C平衡二叉樹

我的平衡碼是:

NodoAB * balance(NodoAB *A){ 
    int D=0,E=0; 
    if(A==NULL) 
    return(NULL); 

    if(fabs(countNodesAB(A->fe)-countNodesAB(A->fd))<=1) 
    return (A); 

    if(countNodesAB(A->fe)-countNodesAB(A->fd)<=-2){ 
    D=countNodesAB(A->fd->fd); 
    printf("D:%d\n",D); 
    E=countNodesAB(A->fd->fe); 
    printf("E:%d\n",E); 
    if(E-D==1) 
     return(rotationLeft(A)); 
    else{ 
     A=rotationRight(A); 
     A->fd=rotationLeft(A->fd); 
     return(A); 
    } 
    } 
} 

和旋轉代碼中的一個是:

NodoAB * rotationLeft(NodoAB *A){ 
    NodoAB *aux,*aux2; 
    if(A==NULL) 
     return(NULL); 

    if(A->fd==NULL) 
     return(A); 

    aux=A; 
    A=A->fd; 
    aux2=A->fe; 
    A->fe=aux; 
    aux->fd=aux2; 
    return(A); 
    } 

計數節點:

int countNodesAB(NodoAB *A){ 
    if(A==NULL) 
    return 0; 

    return(1+countNodesAB(A->fe)+countNodesAB(A->fd)); 
} 
+0

請不要'返回(A);'! 'return'不是一個函數。 – 2012-12-18 14:43:05

+3

@ H2CO3可惜。如果是這樣,那就是結束所有功能的功能。 –

+0

@DanielFischer如果我的感覺正確,我們在這裏進入lambda微積分...:P – 2012-12-18 14:49:37

回答

0

下顯得可疑:

if(countNodesAB(A->fe)-countNodesAB(A->fd)<=2){ 
    D=countNodes(A->fd->fd); 

如果A->fe有2個節點和A->fd有0個節點,那麼這將(我認爲)暗示A->fd爲空,然後導致訪問衝突的showns countNodes致電(A->fd->fd將無效)。

+0

那麼我必須確定countNodesAB(A-> fd)!= 0? –

+0

那麼...你需要確保A-> fd在取消引用指針之前不是NULL。 –

+0

我有一個疑問,我必須在樹中插入節點時調用平衡函數嗎? –