因此,在阅读一些基本的计算机科学概念之前。
- 二进制树是动态分配的结构(通常用于有序存储)。
- 由于其性质,对二叉树的遍历通常是递归的。
这是因为当有两种循环方式时,线性遍历(通过循环)是不自然的。- 递归:这意味着将调用自身的函数。
- 在老式语言中,内存管理需要手动进行内存管理。
- 手册:意味着您必须自己做。
- 当您执行手动内存管理时,您需要实际要求底层系统释放树的每个成员。
- 释放:将内存恢复到全局状态,以便可以重复使用,并且不会耗尽内存。
- 释放:这是通过调用函数
free()
并将要恢复的指针传递给函数来完成的。 - 指针:它像一个虚拟的棍子。最后是记忆。当您请求内存时,您会得到一个具有内存的指针(虚拟棒)。完成后,您将归还指针(虚拟棒)。
递归解决方案:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
然后问题是递归意味着您要重复调用同一函数。这会增加堆栈。增加堆栈会占用更多内存。释放树的原因是,您希望使用更多的内存来回存是适得其反的(即使您确实收回了内存的两个位)。
最后的问题是:
因此,问题集中在将上述递归版本转换为线性解决方案(这样您就不必使用内存了)。
给出节点类型
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
编写函数以释放这些节点的树。
限制条件:
- 无法使用递归(甚至不能间接使用)
无法分配任何动态空间进行跟踪。
注意有一个O(n)解
优胜者:
- 最佳复杂性。
- 抢七局:首先提交
- 抢七局:最少的字符。