【问题标题】:How to count amount of leafes in binary tree without recursion in C?如何计算二叉树中的叶子数量而不用C递归?
【发布时间】:2020-06-16 06:41:18
【问题描述】:

我需要创建一个函数来计算二叉树的叶子数量并打印最高和最低值,对于这个作业我不能使用递归,所以我正在努力弄清楚如何去做。结构是:

typedef struct node {
  int value;
  struct node *left;
  struct node *right;
} Node ;

为了插入一个节点,我创建了一个函数

void insert(Node** tree, int value){
  if(*tree== NULL){
    *tree= createNode(value);
  } else {
    int sValue= (*tree)->value;
    if(value < sValue){
      insert(&(*tree)->left, value);
    } else {
      insert(&(*tree)->right, value);
    }
  }
}

Node* createNode(int value){
  Node* newNode= (Node*)malloc(sizeof(Node));
  newNode->value= value;
  newNode->left= NULL;
  newNode->left= NULL;
  return newNode;
}

【问题讨论】:

  • this question 的答案可能会有所帮助
  • 您可以使用堆栈模拟递归。
  • 使用队列卢克。
  • 正如其他人所说,您需要第二个结构来跟踪您需要探索的节点。 Here 是一个使用堆栈的示例,它应该让您了解您的解决方案是什么样的。

标签: c binary-tree


【解决方案1】:

不使用递归遍历树通常是使用堆栈数据结构完成的,通常是动态增长和收缩的(因为您事先不知道树中的节点数)。

另一种方法是使用一个级别的非叶节点列表“currentNodes”,并对其进行迭代以构建下一个级别的非叶节点列表“nextLevelNodes”。这避免了动态增长的堆栈数据结构:

void printLeafsNonRecursive(Node *tree) {

    // the current level starts with one (root) node:
    Node **currentLevel = calloc(sizeof(Node*),1);
    currentLevel[0] = tree;
    int nodesAdded = 1; 

    while (nodesAdded) {
        unsigned maxNodes = nodesAdded * 2;
        Node **nextLevel = calloc(sizeof(Node*),maxNodes);
        int nextLevelNodeCount = 0;
        for (int i=0; i<nodesAdded; i++) {
            Node *node = currentLevel[i];
            if (node->left == NULL && node->right == NULL) {
                printf("%d\n",node->value);
            } else {
                if (node->left) {
                    nextLevel[nextLevelNodeCount++] = node->left;
                }
                if (node->right) {
                    nextLevel[nextLevelNodeCount++] = node->right;
                }
            }
        }
        nodesAdded = nextLevelNodeCount;
        free(currentLevel);
        currentLevel = nextLevel;
    }
    free(currentLevel);
}

【讨论】:

  • 这很有帮助,非常感谢,但是当我尝试时,有时会显示两个数字,有时只显示一个。也许我做错了什么,你能解释一下它是如何工作的吗?
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2015-08-31
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多