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

yizhihongxing

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日

相关文章

  • Java日常练习题,每天进步一点点(43)

    以下是Java日常练习题43的完整攻略。 题目描述 本题目要求实现一个方法,该方法接受一个整数数组,返回数组中最大的两个数之和。 方法签名 public static int maxTwoSum(int[] nums) 示例输入输出 示例1: 输入: [1,2,3,4,5] 输出: 9 示例2: 输入: [7,5,1,6,3,0] 输出: 13 解题思路 这…

    C 2023年5月22日
    00
  • 基于C语言实现简单的走迷宫游戏

    基于C语言实现简单的走迷宫游戏攻略 一、准备工作 在实现简单的走迷宫游戏前,我们需要了解以下知识:- C语言基础知识,包括控制语句、函数、数组等;- 迷宫的表示方法,可以使用二维数组实现,其中0代表空白区域,1代表障碍物或墙壁区域;- 搜索算法,如深度优先搜索(DFS)和广度优先搜索(BFS),用于求解迷宫路径。 二、实现步骤 根据以上准备工作,我们可以分为…

    C 2023年5月23日
    00
  • C/C++高精度算法的实现

    C/C++高精度算法的实现攻略 什么是高精度算法? 在计算机上进行数学运算通常都是使用二进制来表示数字,而二进制可以在内存中用 0 和 1 表示。在使用标准类型(如 int, long)时,它们可以很方便地执行大量的数学运算。但是,对于较大的数字或需要较高精度的计算,这些类型可能无法满足需求,因为它们只能容纳有限数量的比特,从而有限表示。基于这些原因诞生了高…

    C 2023年5月23日
    00
  • C语言避免malloc/free开销

    要避免频繁的调用malloc和free是为了优化程序的性能和效率。下面提供两种方法来减小malloc和free的开销: 1. 使用内存池 内存池是一种先分配好一定的内存存储池,在程序中使用的时候直接从池中获取内存,使用完后再归还给池中。它的优点在于如果内存池的容量足够,那么内存池中的内存可以重复使用,从而减小了malloc和free带来的开销。以下是使用内存…

    C 2023年5月9日
    00
  • C语言数据的存储超详细讲解中篇练习

    我会为你详细讲解“C语言数据的存储超详细讲解中篇练习”的完整攻略。 攻略概述 “C语言数据的存储超详细讲解中篇练习”主要是讲解C程序中变量和数组的内存模型,以及指针和函数在内存中的存储方式等。该练习主要包含以下部分: C语言中的内存模型 变量和数组的内存模型 指针在内存中的存储方式 函数在内存中的存储方式 示例练习题 在学习这篇练习时,你将会获得对C语言内存…

    C 2023年5月22日
    00
  • C语言中如何获取函数内成员的值你知道吗

    C语言中获取函数内成员的值需要通过指针或者引用的方式来实现。下面提供两种方法: 方法一:使用指针来获取函数内部数据 在函数参数中传递指向结构体的指针,在函数内部通过指针来访问结构体成员,具体步骤如下: 在函数参数中定义一个指向结构体的指针; 在函数内部使用指针来访问结构体的成员,通过“->”符号访问结构体成员。 以下是示例代码: #include &l…

    C 2023年5月23日
    00
  • MathWorks Matlab R2020a(V9.8)密钥安装+永久激活详细教程(含下载)

    MathWorks Matlab R2020a(V9.8)密钥安装+永久激活详细教程(含下载) 一、下载Matlab R2020a Matlab官网提供了免费试用30天的版本,但如果需要永久性的使用,则需要购买正版。在下载前,请确保你购买了Matlab R2020a正版授权并获得了有效的密钥。 在Matlab官网中下载软件,下载链接为 https://www…

    C 2023年5月22日
    00
  • c#基础——了解程序结构

    C#基础——了解程序结构 C#是一种现代的、通用的、面向对象的编程语言。在学习C#编程语言时需要了解其基本的程序结构,其中包括C#程序中代码的组织方式以及控制其执行流程的结构和元素。 基本程序结构 C#程序由以下几个基本元素组成: 命名空间(Namespace) 类(Class) 方法(Method) 语句(Statement) 表达式(Expression…

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