【问题标题】:BST Binary Tree Remove function in C the leaves with value = 0BST 二叉树删除 C 中的函数值 = 0 的叶子
【发布时间】:2014-12-07 22:12:16
【问题描述】:

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

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

【问题讨论】:

  • 那么,你想要一个可以做到这一点的函数吗?您是否已经创建了该功能,但它的措辞不好...请您澄清一下吗?
  • 是的,但这是完全错误的。我错过了 BST 理论中的一些东西。因此,如果可以告诉我如何创建它,那就太好了!
  • 但是,你能在这里发布你的实际代码吗?如果不知道您用来表示 BST 的结构,任何人都很难为您提供帮助...
  • 我很想提供一个可行的解决方案,但由于没有证据表明 OP 自己编写了任何代码,所以我离开了这里。
  • 拜托,@NikolaosMaliganis,下次您应该更好地说明您的问题。例如,至少发布您的结构的代码。而且,你在写BST,但这通常用于二叉搜索树,与简单的二叉树有什么不同

标签: c tree binary-tree binary-search-tree


【解决方案1】:

这是一个伪代码:

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
}

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

【讨论】:

  • 这取决于你的树的表示。通常,您应该调用 free 并调整一些指针。在这种情况下,由于被删除的节点始终是叶子节点,您只需将其父节点指向它的指针设置为 NULL。
  • 所以需要通知父亲删除左节点或右节点。
  • 那将如何通知父亲?
  • 如果要删除节点,返回负数如何?它必须由父亲而不是叶子删除,所以左/右指针也可以设置为NULL(除非你也传递一个**节点指针?)
  • @Marcellus 修改了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2019-11-21
相关资源
最近更新 更多