1

単純なリストからのデータを含むバイナリ ツリーがあり、バランスをとる必要がありますが、「セグメンテーション違反 (コア ダンプ)」というエラーが表示され続けます。

私の残高コードは次のとおりです。

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);
    }
  }
}

ローテーションコードの1つは次のとおりです。

 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));
}
4

1 に答える 1

0

以下は疑わしいようです。

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

A->fe2つのノードがあり、 0のノードがある場合A->fd、それは(私が思うに)A->fdNULLであることを意味し、表示されたcountNodes呼び出しでアクセス違反が発生します(A->fd->fd無効になります)。

于 2012-12-18T15:07:58.257 に答える