在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;
}
答案 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)
有吨加速删除树的方法,此列表并非详尽无遗:
这导致以下问题: