从n-ary树中删除完整分支

时间:2018-05-09 01:24:43

标签: c tree

我想创建一个能够删除分支(甚至整个树)的函数。树的结构如下:

typedef struct node {
    char data;
    struct node *child;
    struct node *sibling;
}*tree;

我创建了一个能够在树中查找给定数据然后返回该节点的地址然后将其删除的函数。假设我想要删除数据中有B的节点,它应该删除它的所有子节点和节点本身,然后我应该留下以下树:

      R                        R     
      |                        |     
      B _ C _ D      -->>      C _ D              
      |       |                    | 
      E _ F   G                    G 

我有以下功能,但它只对删除整个树有用,如果我用它来删除分支,我将留下指向已经释放的内存的指针。

void delete_branch(tree node){
    if(node != NULL)
    {
        delete_branch(node->child);
        delete_branch(node->sibling);
        free(node);
    }
}

我知道问题是什么,我只需要更新指针,以便它们再次指向正确的位置,但我无法理解如何使用涉及的递归函数来完成它。如果需要更多信息,请随时询问。

1 个答案:

答案 0 :(得分:1)

考虑到你想保留兄弟而不是删除它

tree delete_branch(tree node) {
    tree new_child=NULL;
    if(node != NULL) {
        while(node->child!=NULL) { //the child will keep being replaced by his sibling
            node->child=delete_branch(node->child); // replace the child by his sibling until there is none
        }
        new_child=node->sibling; // before freeing the child keep his the pointer to his sibling 
        free(node);
    }
    return new_child; // the sibling will replace the deleted child in the parent reference
}

移除孩子时;

parent->child=delete(parent->child);