C语言中的BST二叉树删除函数将值设为0

C语言中的BST二叉树删除函数将值设为0,c,tree,binary-tree,binary-search-tree,C,Tree,Binary Tree,Binary Search Tree,我试图在C中创建一个函数,该函数应该能够从二叉树(BST)中删除(删除)所有叶子,该树作为参数传递,值为零值(0),返回结果将是删除叶子的数量。注意:不是值为0的节点,而是叶。例如,图中的BST: 函数将返回2(在删除红色圆圈零后)。这是一个伪代码: int delete_zero_leaves (node){ int deleted delete_zero_leaves_aux (node, &deleted); return deleted } point

我试图在C中创建一个函数,该函数应该能够从二叉树(BST)中删除(删除)所有叶子,该树作为参数传递,值为零值(0),返回结果将是删除叶子的数量。注意:不是值为0的节点,而是叶。例如,图中的BST:


函数将返回2(在删除红色圆圈零后)。

这是一个伪代码:

int delete_zero_leaves (node){
    int deleted
    delete_zero_leaves_aux (node, &deleted);
    return deleted
}

pointer delete_zero_leaves_aux (node, deleted){
    boolean is_leaf = true
    // if there is a child
    if (node->left != NULL){
            // passing deleted by reference
            node->left = delete_zero_leaves_aux (node->left, &deleted)
            is_leaf = false
    }
    // if there is a child on the right side
    if (node->right != NULL){
            // passing deleted by reference
            node->right = delete_zero_leaves_aux (node->right, &deleted)
            is_leaf = false
    }
    if (is_leaf AND node->value == 0){
        free(node)
        deleted += 1
        return NULL
    }
    return node
}

因为您说过节点没有自己的父指针,所以可以返回一个指针并设置父指针的值(左或右)。

这是一个伪代码:

int delete_zero_leaves (node){
    int deleted
    delete_zero_leaves_aux (node, &deleted);
    return deleted
}

pointer delete_zero_leaves_aux (node, deleted){
    boolean is_leaf = true
    // if there is a child
    if (node->left != NULL){
            // passing deleted by reference
            node->left = delete_zero_leaves_aux (node->left, &deleted)
            is_leaf = false
    }
    // if there is a child on the right side
    if (node->right != NULL){
            // passing deleted by reference
            node->right = delete_zero_leaves_aux (node->right, &deleted)
            is_leaf = false
    }
    if (is_leaf AND node->value == 0){
        free(node)
        deleted += 1
        return NULL
    }
    return node
}

因为您说过节点没有自己的父指针,所以可以返回一个指针并设置父指针的值(左或右)。

这是一个伪代码:

int delete_zero_leaves (node){
    int deleted
    delete_zero_leaves_aux (node, &deleted);
    return deleted
}

pointer delete_zero_leaves_aux (node, deleted){
    boolean is_leaf = true
    // if there is a child
    if (node->left != NULL){
            // passing deleted by reference
            node->left = delete_zero_leaves_aux (node->left, &deleted)
            is_leaf = false
    }
    // if there is a child on the right side
    if (node->right != NULL){
            // passing deleted by reference
            node->right = delete_zero_leaves_aux (node->right, &deleted)
            is_leaf = false
    }
    if (is_leaf AND node->value == 0){
        free(node)
        deleted += 1
        return NULL
    }
    return node
}

因为您说过节点没有自己的父指针,所以可以返回一个指针并设置父指针的值(左或右)。

这是一个伪代码:

int delete_zero_leaves (node){
    int deleted
    delete_zero_leaves_aux (node, &deleted);
    return deleted
}

pointer delete_zero_leaves_aux (node, deleted){
    boolean is_leaf = true
    // if there is a child
    if (node->left != NULL){
            // passing deleted by reference
            node->left = delete_zero_leaves_aux (node->left, &deleted)
            is_leaf = false
    }
    // if there is a child on the right side
    if (node->right != NULL){
            // passing deleted by reference
            node->right = delete_zero_leaves_aux (node->right, &deleted)
            is_leaf = false
    }
    if (is_leaf AND node->value == 0){
        free(node)
        deleted += 1
        return NULL
    }
    return node
}



既然您说节点没有自己的父节点指针,那么您可以返回一个指针并设置父节点指针的值(左或右)。

那么,您需要一个函数来完成吗?您是否已经创建了该函数,但它没有很好地。。。请你澄清一下好吗?是的,但这是完全错误的。我错过了BST理论中的一些东西。因此,如果有可能给我如何创建它的方法,那就太棒了!但是,你能在这里发布你的实际代码吗?如果不知道您用来表示BST的结构,任何人都很难给您提供一些帮助。我很想提供一个有效的解决方案,但由于没有证据表明OP自己编写了任何代码,我将离开这里。请@nikolasmaliganis,下次您应该更好地说明您的问题。例如,至少发布结构的代码。此外,您正在编写BST,但这通常用于二叉搜索树,与简单的二叉树有什么不同呢?o,您需要一个函数来实现它吗?您是否已经创建了该函数,但它没有很好地。。。请你澄清一下好吗?是的,但这是完全错误的。我错过了BST理论中的一些东西。因此,如果有可能给我如何创建它的方法,那就太棒了!但是,你能在这里发布你的实际代码吗?如果不知道您用来表示BST的结构,任何人都很难给您提供一些帮助。我很想提供一个有效的解决方案,但由于没有证据表明OP自己编写了任何代码,我将离开这里。请@nikolasmaliganis,下次您应该更好地说明您的问题。例如,至少发布结构的代码。此外,您正在编写BST,但这通常用于二叉搜索树,与简单的二叉树有什么不同呢?o,您需要一个函数来实现它吗?您是否已经创建了该函数,但它没有很好地。。。请你澄清一下好吗?是的,但这是完全错误的。我错过了BST理论中的一些东西。因此,如果有可能给我如何创建它的方法,那就太棒了!但是,你能在这里发布你的实际代码吗?如果不知道您用来表示BST的结构,任何人都很难给您提供一些帮助。我很想提供一个有效的解决方案,但由于没有证据表明OP自己编写了任何代码,我将离开这里。请@nikolasmaliganis,下次您应该更好地说明您的问题。例如,至少发布结构的代码。此外,您正在编写BST,但这通常用于二叉搜索树,与简单的二叉树有什么不同呢?o,您需要一个函数来实现它吗?您是否已经创建了该函数,但它没有很好地。。。请你澄清一下好吗?是的,但这是完全错误的。我错过了BST理论中的一些东西。因此,如果有可能给我如何创建它的方法,那就太棒了!但是,你能在这里发布你的实际代码吗?如果不知道您用来表示BST的结构,任何人都很难给您提供一些帮助。我很想提供一个有效的解决方案,但由于没有证据表明OP自己编写了任何代码,我将离开这里。请@nikolasmaliganis,下次您应该更好地说明您的问题。例如,至少发布结构的代码。此外,您正在编写BST,但这通常用于二叉搜索树,与简单的二叉树有什么不同取决于树的表示形式。通常情况下,您应该只调用free并调整一些指针。在这种情况下,由于被删除的节点始终是一个叶,您只需将从其父节点指向它的指针设置为NULL。因此需要通知父节点删除左侧或右侧节点。如何通知父节点?如果要删除节点,则返回负数如何?它必须由父节点而不是叶节点删除,因此左/右指针也可以设置为
NULL
(除非您还传递**节点指针?)@Marcellus已修改了答案。这取决于树的表示形式。通常情况下,您应该只调用free并调整一些指针。在这种情况下,由于被删除的节点始终是一个叶,您只需将从其父节点指向它的指针设置为NULL。因此需要通知父节点删除左侧或右侧节点。如何通知父节点?如果要删除节点,则返回负数如何?它必须由父节点而不是叶节点删除,因此左/右指针也可以设置为
NULL
(除非您还传递**节点指针?)@Marcellus已修改了答案。这取决于树的表示形式。通常情况下,您应该只调用free并调整一些指针。在这种情况下,由于被删除的节点始终是一个叶子,您只需要将从其父节点指向它的指针设置为NULL。因此,需要通知父节点删除左侧或右侧节点。如何通知父节点