去除叶子不会影响BST - C.

时间:2012-06-01 05:11:41

标签: c pointers struct binary-search-tree

我写了一个函数来取消BST的所有叶子。 BST当然有一个左右指针和一个名为data的char来存储节点的值。

void removeLeaves(struct Tree* T){
  if(T->left == NULL && T->right == NULL){
    printf("removing %c\n", T->data);
    T=NULL;
  }
  else{
    if(T->left!=NULL){
      removeLeaves(T->left);
    }
    if(T->right!=NULL){  
      removeLeaves(T->right);
    }
  }  
}

我在调用此函数之前和之后打印树。 虽然上面的print语句可以工作并打印出无效的节点,但结果树是相同的。 我有类似的东西:

print(BST);
removeLeaves(BST);
print(BST);

知道发生了什么事吗? 感谢。

3 个答案:

答案 0 :(得分:1)

您正在通过值传递T,因此将T设置为null不会执行任何操作(T只是指针的本地副本)。

您需要某种方式将T的“所有者”(即父级 - >左侧或父级 - >右侧)设置为空。

(同样通过将T设置为null可能会导致内存泄漏 - 您是否需要释放()?)

答案 1 :(得分:1)

T=NULL;将null赋给本地指针,而不是树中的任何内容。您需要使用struct Tree **,以便修改struct Tree *

void removeLeaves(struct Tree ** T){
  if((*T)->left == NULL && (*T)->right == NULL){
    printf("removing %c\n", (*T)->data);
    *T = NULL;
  }
  else{
    if((*T)->left!=NULL){
      pruneTree((*T)->left);
    }
    if((*T)->right!=NULL){  
      pruneTree((*T)->right);
    }
  }  
}

答案 2 :(得分:0)

您拥有所需的部件。这主要是重新排序它们。

void removeLeaves(struct Tree* const T){
  if(T->left!=NULL){
    removeLeaves(T->left);
    T->left = NULL;
  }
  if(T->right!=NULL){  
    removeLeaves(T->right);
    T->right = NULL;
  }
}

但请注意const。你的代码可以在没有它的情况下工作,但它不应该,因为设置T = NULL实际上并没有做任何事情,尽管可能会有这样的事情。

更新: @ PaulP.R.O。答案很有意思,顺带一提。我更喜欢我的,但你可以尝试两种,看看哪种套装。

顺便说一句,请确保您不需要在某处调用free(),以防止内存泄漏。