【问题标题】:Free a tree structure with a non recursive function使用非递归函数释放树结构
【发布时间】:2015-01-05 04:29:39
【问题描述】:

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

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

.. 我想在用malloc 分配每个节点之后freeevery 节点。

这棵树应该能够毫无问题地容纳数百个节点。因此,使用递归函数将帧堆叠起来效率非常低,那么是否有任何形式的循环或可以让我将所有节点分组到数组中的东西?递归真的是唯一的方法吗?

【问题讨论】:

  • 你能改变你的节点来包含一个指向父节点的指针吗?否则,你总是需要 O(height) 内存。

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


【解决方案1】:

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

你确定递归是个问题吗?使用通常的递归,几百个节点对我来说完全没问题。你在什么架构上?

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 2016-03-18
      • 2019-07-10
      • 2016-04-13
      • 1970-01-01
      • 2012-10-22
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多