C 使用非递归函数释放树结构

C 使用非递归函数释放树结构,c,recursion,data-structures,tree,recursive-datastructures,C,Recursion,Data Structures,Tree,Recursive Datastructures,假设我有一个如下所示的结构: struct tree_suspects { char **description; struct tree_suspects *right_description; struct tree_suspects *wrong_description; } 。。我想在使用malloc分配每个节点后,释放每个节点 树应该能够容纳数百个节点而不会出现问题。因此,使用递归函数堆叠帧的效率会非常低,那么是否有任何形式的循环或其他东西允许我将数组中的所有

假设我有一个如下所示的结构:

struct tree_suspects {
    char **description;
    struct tree_suspects *right_description;
    struct tree_suspects *wrong_description;
}
。。我想在使用
malloc
分配每个节点后,释放
每个节点


树应该能够容纳数百个节点而不会出现问题。因此,使用递归函数堆叠帧的效率会非常低,那么是否有任何形式的循环或其他东西允许我将数组中的所有节点分组?递归真的是唯一的方法吗?

不是。您可以使用任何列表、堆栈或队列结构,但除非您知道元素的总数(在这种情况下,您可以预先分配列表并将其类似于环形缓冲区使用),否则这不会提供显著的优势

你确定递归是个问题吗?对于我来说,使用通常的递归,只有100个节点听起来很好。你在什么建筑上

如果您担心内存访问,只需确保将这些节点及其数据放在类似的内存位置即可。因为您使用的是二叉树,所以至少可以将树本身放入一个数组中(如果树中有n个节点,则开销最多为n-1)。我认为优化字符串不是必需的,但是如果您也想这样做,那么使用子索引字符数组

关于树结构的存储布局,平衡树非常容易存储()。在这种情况下,应该避免不平衡的树,我建议使用类似红黑树的方法,这并不太难实现

使用递归函数将大大降低堆栈效率

平衡树中的数百个节点并不是什么大问题:一个有十几个级别的平衡树很容易适应一千多个级别,因此在这种情况下递归不会成为问题


如果树是不平衡的,您可以构建一个非递归函数来处理它,方法是保留要释放的显式节点堆栈。将根元素推到堆栈上,并创建一个循环,从堆栈中取出下一个元素,将其两个子元素推到堆栈上,然后释放节点本身。此算法将遍历整个树,并在堆栈为空时停止。

能否更改节点以包含指向父节点的指针?否则,您总是需要O(高度)内存。