在C中删除二叉树的最快方法

时间:2017-03-15 00:43:17

标签: c binary-tree

在C中删除二叉树的最快方法是什么?为什么? 有没有办法比这更好:

void deleteTreeUtil(struct node* node)
   {
       if (node == NULL) return;
       deleteTreeUtil(node->left);
       deleteTreeUtil(node->right);
       printf("\n Deleting node: %d", node->data);
       free(node);
    }

void deleteTree(struct node** node_ref)
{
  deleteTreeUtil(*node_ref);
  *node_ref = NULL;
}

4 个答案:

答案 0 :(得分:2)

小优化以提高大树的性能:

void _deleteTree(struct node* node)
{
       if (node->left)
       {
             _deleteTree(node->left);
             free(node->left);
       }
       if (node->right)
       {
             _deleteTree(node->right);
             free(node->right);
       }
}

void deleteTree(struct node** node_ref)
{
     if (*node_ref)
     {
          _deleteTree(*node_ref);
          free(*node_ref);
     }
}

答案 1 :(得分:1)

显示的方法非常精简和快速,假设删除了printf(该部分真的慢)。我没有看到更快的方法,假设每个节点都是单独分配的,并且节点是按提供的代码的建议单链接的。

如果树节点是双向链接的,则可以在没有递归的情况下进行广度优先遍历,从而减少堆栈增长并可能缩短执行时间。如果树被重复分配和删除,那么维护一个节点结构池(而不是每次都是alloc / free)肯定会节省分配过程的时间(但可能不会加快删除速度)。

答案 2 :(得分:0)

要删除树,即释放二叉树中的所有节点,无论您的遍历样式(inorder / preorder / postorder)是什么,您都必须访问所有节点。在算法方面,没有什么可以减少时间复杂度。

你可以使用一些编程黑客,最多可以尝试的是你可以选择迭代风格,但这可能不会给你非常显着的速度提升。

答案 3 :(得分:0)

加速删除树的方法,此列表并非详尽无遗:

  • 维护节点列表,然后您可以按顺序释放它们(它会保存递归函数调用)
  • 使用编译器的优化标志
  • 将节点存储在自动变量中,只需从声明它们的函数返回并释放它们,然后自动执行:)
  • 一次性分配所有节点在一个大的节点数组中,大到足以存储整个树,然后释放数组并完成
  • 不要将其删除并重复使用或在程序退出时将其释放

这导致以下问题:

  • 如何实施您的树?
  • 是固定大小的树,事先知道吗?
  • 你能在多大程度上改变结构和创作过程?
  • 你想加快一些树的释放时间,还是想减少解放程序的算法复杂度?
  • 为什么需要加快删除过程?