首页 > 解决方案 > 释放二叉树并计算空闲节点的数量 -> 没有全局变量

问题描述

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;
}

标签: c

解决方案


如果局部变量未初始化,则其值为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;
}

推荐阅读