我已经完成了插入节点和删除树的教程。我测试了一下,效果很好。但是,我不明白为什么需要在insert中通过引用传递根,而在deleteAll中只传递指针。因为我认为只传递指针它是一个值引用,然后每次更改都只能在函数中看到。

typedef struct node{
    int element;
    struct node *left;
    struct node *right;
}*tTree;

void insert(tTree *myTree, int element){
  if(*myTree == NULL){
    myTree= (tTree)malloc(sizeof(*myTree));
    myTree->element = element;
    myTree->left = NULL;
    myTree->right = NULL;
  }
  else{
    int treeElement = (*myTree)->element;
    if( treeElement > element){
      insert(&(*myTree)->left, element);
    }
    else{
      insert(&(*myTree)->right, element);
    }
  }
}



void deleteAll(tTree myTree){
    if(myTree != NULL){
        deleteAll(myTree->right);
        deleteAll(myTree->left);
        free(myTree);
    }
}

int size(tTree myTree){
    if (myTree != NULL){
        return 1 + size(myTree->right) + size(myTree->left);
    }
    else
        return 0;
}

int main(){

  tTree root = NULL;
  insert(&root,3);
  insert(&root,2);
  insert(&root,4);
  insert(&root,1);
  printf("Number of nodes: %d\n",size(root));
  deleteAll(root);
    root = NULL;
  printf("Number of nodes: %d\n",size(root));
  return 1;
}

最佳答案

删除只需要它执行的语句的指针。它不会将任何信息传递回调用函数。但是,如果需要,插入函数将进行分配,在这种情况下,必须将分配的指针传回调用方。

10-08 15:12