释放具有非递归函数的树结构

时间:2014-11-08 12:37:08

标签: c recursion data-structures tree recursive-datastructures

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

struct tree_suspects {
    char **description;
    struct tree_suspects *right_description;
    struct tree_suspects *wrong_description;
}

..我希望free每个节点用malloc分配每个节点后。{/ p>

树应该能够容纳数百个节点而没有问题。因此,使用递归函数堆栈帧会非常低效,那么是否有任何形式的循环或某些东西可以让我对数组中的所有节点进行分组?递归真的是唯一的方法吗?

2 个答案:

答案 0 :(得分:1)

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

你确定递归是一个问题吗?通常的递归对我来说几百个节点听起来完全没问题。你在做什么建筑?

如果您担心内存访问,您应该确保将这些节点及其数据放在类似的内存位置。由于您使用的是二叉树,因此至少可以将树本身放在一个数组中(在树中有n个节点时,这个开销最多为n-1)。我认为不需要优化字符串,但如果你想这样做,那么请使用例如subindexed char数组。

关于树结构的存储布局,平衡树非常容易存储(https://en.wikipedia.org/wiki/Binary_tree#Arrays)。在这种情况下应该避免不平衡的树木,我建议像红黑树这样的东西,实施起来并不太难。

答案 1 :(得分:1)

  使用递归函数堆栈

的效率非常低

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

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