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

其中一个轮换代码是:

 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->fe有 2 个节点并且A->fd有 0 个节点,那么它会(我认为)暗示它A->fd是 NULL,然后导致显示的 countNodes 调用发生访问冲突(A->fd->fd无效)。

于 2012-12-18T15:07:58.257 回答