21xrx.com
2025-03-26 14:11:32 Wednesday
文章检索 我的文章 写文章
C++编程:求二叉树中叶子节点的个数
2023-06-28 21:33:22 深夜i     --     --
C++ 二叉树 叶子节点 个数 编程

二叉树是一种常见的数据结构,由根节点、左子树、右子树构成。其中,叶子节点指的是没有子节点的节点,其在二叉树中往往扮演着重要的角色。因此,在使用二叉树时,经常需要求出二叉树中叶子节点的个数。

C++编程是实现二叉树功能的常见方式,如何求二叉树中叶子节点的个数呢?本文将介绍两种方法。

方法一:递归法

递归法是一种直观且简单的方法,其基本思路是:在递归过程中统计二叉树中叶子节点的个数。具体实现如下:

int countLeafNode(TreeNode* root) {
  if (root == nullptr)
    return 0;
  
  if (root->left == nullptr && root->right == nullptr)
    return 1;
  
  return countLeafNode(root->left) + countLeafNode(root->right);
}

具体来说,如果当前节点没有子节点(即为叶子节点),则返回1;如果有子节点,递归计算左子树和右子树中的叶子节点个数之和。

方法二:迭代法

迭代法是一种非递归的方法,可以将递归转换为循环实现,从而避免递归深度过大的问题。具体实现如下:

int countLeafNode(TreeNode* root) {
  if (root == nullptr)
    return 0;
  
  int count = 0;
  stack<TreeNode*> nodes;
  nodes.push(root);
  while (!nodes.empty()) {
    TreeNode* node = nodes.top();
    nodes.pop();
    if (node->left == nullptr && node->right == nullptr) {
      count++;
    }
    if (node->left != nullptr) {
      nodes.push(node->left);
    }
    if (node->right != nullptr) {
      nodes.push(node->right);
    }
  }
  return count;
}

具体来说,我们维护一个堆栈,先将根节点入栈,然后循环对堆栈中的节点进行处理:如果当前节点为叶子节点,则计数器加1;否则将其左右子节点依次入栈。循环处理完所有节点后,即得到了二叉树中叶子节点的个数。

以上两种方法都可以求解二叉树中叶子节点的个数,具体选择哪种方法可以根据实际问题的需求进行选择。总之,对于任何数据结构,都需要深入理解其内部原理和实现方式,才能更好地利用它进行编程。

  
  

评论区