C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

计算一个二叉树中叶子节点的个数是二叉树的常见问题之一。使用递归或非递归算法都可以实现这个功能,下面我们逐步讲解两种算法的实现过程。

递归算法

递归算法是一种自上而下、分而治之的算法思想。在二叉树中,递归算法的实现也是先计算根节点,再计算左子树和右子树,最终得出结果。

递归计算二叉树叶子节点个数的方法,可以分为三个步骤:

  • 如果根节点为空,则叶子节点数量是0。
  • 如果根节点的左右节点都为空,则根节点为叶子节点,叶子节点数量是1。
  • 如果根节点的左右节点有一个或两个非空,则叶节点数量是左子树叶节点的数量加上右子树叶节点的数量。

下面是递归算法计算二叉树叶节点个数的实现示例:

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;
   }
   stack<TreeNode*> s;
   s.push(root);
   int count = 0;
   while (!s.empty()) {
      TreeNode* node = s.top();
      s.pop();
      if (node->left == nullptr && node->right == nullptr) {
         count++;
      }
      if (node->right != nullptr) {
         s.push(node->right);
      }
      if (node->left != nullptr) {
         s.push(node->left);
      }
   }
   return count;
}

以上就是使用递归和非递归算法分别计算二叉树叶节点个数的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Win8系统检测更新时出现8024401C提示的解决方法

    当Win8系统检测更新时出现8024401C提示时,可能由于以下原因导致: 未正确配置Internet Explorer(IE)代理设置。 安全防火墙或第三方杀毒软件阻止了系统更新。 Windows Update缓存已损坏。 以下是针对这三种可能原因的解决方案: 配置IE代理设置 步骤1:首先按下Win+R键,运行“Internet选项”。 步骤2:在“In…

    C 2023年5月23日
    00
  • C语言中如何进行元编程?

    元编程是指在程序运行时生成、操作或展示代码。在C语言中进行元编程,通常需要使用预处理器宏来实现,下面是具体的步骤和示例说明。 步骤 定义宏变量,使其能够接受可变数量的参数。 #define MACRO(…) // 可变数量的参数 在宏中使用预处理器指令,对宏参数进行操作,生成新的代码。 #define MACRO(…) printf(__VA_ARG…

    C 2023年4月27日
    00
  • MySQL系列之开篇 MySQL关系型数据库基础概念

    MySQL系列之开篇 MySQL关系型数据库基础概念 什么是关系型数据库? 关系型数据库是最为常见的数据库类型,它使用了表格来存储数据,每个表格都有一个唯一的名字,并且由一个或多个列组成。 在关系型数据库中,表格之间可以相互关联,从而形成一个关系型的数据模型。 关系型数据库的优点 简单易学,广泛使用。 数据之间的关系清晰。 可靠性、稳定性好。 支持事务处理,…

    C 2023年5月22日
    00
  • 深入理解C++中的new和delete并实现对象池

    深入理解C++中的new和delete并实现对象池 1. C++中的new和delete 1.1 new操作符 new操作符是C++中用于动态分配内存的关键字,它可以在堆上分配空间,并返回指向新分配空间的指针。new操作符有多种语法,其中最常用的是: Type *pointer = new Type; 其中Type表示要分配的类型,pointer是指向新分配…

    C 2023年5月22日
    00
  • PHP中常见的密码处理方式和建议总结

    PHP中常见的密码处理方式和建议总结 在PHP中,密码处理是一个重要的安全问题。本文将介绍PHP中常见的密码处理方式和建议总结。 常见的密码处理方式 明文存储 明文存储是最不安全的方式,它直接将用户的密码以明文形式存储在数据库中,容易被黑客猜测和盗取,不建议使用。 MD5加密 MD5是一种常用的哈希算法,可以将字符串转换为长度固定的哈希值。使用MD5加密用户…

    C 2023年5月23日
    00
  • C++线程安全的单例模式讲解

    下面我将为您详细讲解“C++线程安全的单例模式讲解”的完整攻略。 什么是单例模式? 单例模式是一种创建型设计模式,它可以保证一个类在任何情况下都只有一个实例,并且提供了一个全局访问点来访问该实例。在单例模式中,类的构造函数是私有的,所以无法通过常规方法创建新的实例。单例模式通常被用来控制资源访问,如数据库连接的单例。 为什么要使用线程安全的单例模式? 当一个…

    C 2023年5月22日
    00
  • 基于C语言实现计算生辰八字五行的示例详解

    基于C语言实现计算生辰八字五行的示例详解 生辰八字在中国占卜文化中常用,它可以根据出生年月日时,推算得到一个人的八字。通过八字可以了解一个人的命运、身体状况、婚姻状况等。五行是中国传统文化中非常重要的概念,根据五行可以推算得到一个人的五行属性,从而更好地了解自己的性格特点和行为习惯。 下面,我们将介绍如何基于C语言实现计算生辰八字五行的功能。通过该示例,您可…

    C 2023年5月22日
    00
  • C++ Boost log日志库超详细讲解

    C++ Boost log日志库超详细讲解 什么是C++ Boost log日志库? C++ Boost log是一个高度灵活和可定制的C++日志库,它提供了一系列便利的接口和功能,帮助我们实现日志的收集、保存、查询和分析等操作。同时,它还提供了多种日志输出格式和输出目标,例如标准输出、文件、syslog等。 安装C++ Boost log日志库 在使用C+…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部