c - 释放二叉树并计算空闲节点的数量 -> 没有全局变量
问题描述
inint freeAB(ABin a)
是a
指向树根的指针。我必须释放它占用的所有内存空间,返回释放的节点数。这是一个二叉搜索树。
问题:如果我不removeNodes
使用 0 进行初始化,它是否有机会使用随机数进行初始化?
注意:我知道我可以做一个计算所有叶子的函数,然后使用这个函数来释放所有内容。但我想把所有事情都做一件事。
valor = 价值,pai = 父亲,esq = 左,dir = 右。
typedef struct nodo {
int valor;
struct nodo *pai, *esq, *dir;
} *ABin;
我的解决方案:
int freeAB(ABin a){
int removeNodes;
while(a != NULL){
removeNodes++;
freeAB(a->esq);
removeNodes++;
freeAB(a->dir);
free(a->pai);
}
return removeNodes;
}
解决方案
如果局部变量未初始化,则其值为indeterminate。所以在给它一个值之前使用++
操作符会触发未定义的行为。所以你应该把它初始化为0。removeNodes
关于计算节点,您递归调用freeAB
但从不使用返回值。您需要将此返回值添加到当前计数器。
还有,while(a != NULL)
没有意义。 a
在循环内部永远不会改变,所以如果进入循环,你就会有一个无限循环。这应该是一个if
声明。
如果它指向父节点,您可能不希望这样做,free(a->pai)
因为它仍在早期的递归调用中使用,因此应该删除它。但是,您确实希望在遍历其子节点后释放当前节点。
应用这些更改后,您的函数现在应如下所示:
int freeAB(ABin a){
int removeNodes = 0;
if (a != NULL){
removeNodes++;
removeNodes += freeAB(a->esq);
removeNodes += freeAB(a->dir);
free(a);
}
return removeNodes;
}
推荐阅读
- javascript - Am 图表 v3 XY 不适用于对数刻度
- r - 如何在ggplot中添加每天作为x轴标签
- javascript - 在一行中随机化 4 个 div 元素 Javascript + JQuery
- kubernetes - 字节数组作为 kubernetes 的秘密?
- python - 在字符串中的关键字之前删除 '\n'
- python - python抓取一个类href
- amazon-web-services - AWS Cloudfront 防止钱包被拒绝?
- react-native - 更新数组后,firestore 文档 ID 将未定义
- javascript - 如何显示来自 Rails AJAX JSON 响应的文本 - Javascript 正在返回 [object HTMLDocument]
- in-app-billing - 在哪里可以找到 Google Play 结算库的最新文档?