当前位置: 首页 > article >正文

统计二叉树叶子结点个数

以下为你介绍统计二叉树叶子结点个数的常见方法,包括递归和非递归两种实现方式,并以代码示例(以Python为例)来说明:

递归方法

  • 思路

    • 对于一棵二叉树,其叶子结点是指没有左子树和右子树的结点。
    • 可以通过递归遍历二叉树来统计叶子结点个数。递归计算左子树的叶子结点个数、右子树的叶子结点个数,然后判断根结点是否为叶子结点(即左子树和右子树都为空),如果是则加上1 。
  • 代码示例

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def count_leaf_nodes(root):
    if root is None:
        return 0
    # 递归计算左子树叶子结点个数
    left_leaf_count = count_leaf_nodes(root.left)
    # 递归计算右子树叶子结点个数
    right_leaf_count = count_leaf_nodes(root.right)
    # 如果根结点是叶子结点,返回左子树叶子结点个数 + 右子树叶子结点个数 + 1
    if root.left is None and root.right is None:
        return left_leaf_count + right_leaf_count + 1
    # 否则返回左子树叶子结点个数 + 右子树叶子结点个数
    return left_leaf_count + right_leaf_count

在上述代码中:

  • 首先定义了二叉树的节点类 TreeNode
  • 然后 count_leaf_nodes 函数实现了统计叶子结点个数的功能。通过对根结点及其左右子树的递归处理,最终返回整棵二叉树的叶子结点个数。

非递归方法(利用队列实现层次遍历)

  • 思路

    • 利用队列进行层次遍历二叉树。
    • 在遍历过程中,当一个结点的左子树和右子树都为空时,就说明该结点是叶子结点,此时计数加1 。
  • 代码示例

from collections import deque


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def count_leaf_nodes_non_recursive(root):
    if root is None:
        return 0
    leaf_count = 0
    queue = deque([root])
    while queue:
        node = queue.popleft()
        if node.left is None and node.right is None:
            leaf_count += 1
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
    return leaf_count

在这段代码中:

  • 同样先定义了 TreeNode 类。
  • count_leaf_nodes_non_recursive 函数借助队列实现层次遍历二叉树来统计叶子结点个数。遍历过程中,一旦遇到叶子结点就对计数变量 leaf_count 进行累加,最终返回叶子结点的总个数。

这两种方法都可以有效地统计二叉树叶子结点的个数,具体使用哪种方法可根据实际情况和需求来选择。例如,如果对递归理解和运用熟练,递归方法代码可能更简洁直观;如果希望避免递归可能带来的栈溢出问题(对于非常深的二叉树),非递归的层次遍历方法是不错的选择。


http://www.kler.cn/a/428154.html

相关文章:

  • 我是如何写作的?
  • 【数据结构】二叉树
  • 芯片AI深度实战:基础篇之langchain
  • 【新春特辑】2025年春节技术展望:蛇年里的科技创新与趋势预测
  • USB 3.1-GL3510-52芯片原理图设计
  • 园区管理智能化创新引领企业效能提升与风险控制新趋势
  • Unity3D运行设置物体为预制体
  • 福昕PDF低代码平台
  • Oracle EBS FA 如何打开关闭的资产会计期间?
  • CTF-WEB: 目录穿越与伪协议 [第一届国城杯 signal] 赛后学习笔记
  • 现代C++ 7 初始化
  • 高效开发 Python Web 应用:FastAPI 数据验证与响应体设计
  • 在vue3里使用scss实现简单的换肤功能
  • 3D 生成重建018-LangSplat用文本在3DGS内搜寻你的真爱
  • CCF-GESP 等级考试 2024年12月认证C++三级真题解析
  • MATLAB 直线插点重采样(98)
  • C 语言进阶:突破基础,探索更强大的编程世界
  • 常见面试题之JAVA集合
  • 光伏组件的度电成本如何降低?
  • 解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享20241204
  • Docker--Docker Container(容器)
  • Android显示系统(03)- OpenGL ES - GLSurfaceView的使用
  • Android 调用手机相册,相机功能实现
  • 零基础学安全--Burp Suite验证码识别以及爆破
  • 记一次由docker容器使得服务器cpu占满密码和密钥无法访问bug
  • 基于 NXP S32K312+FS23 的汽车通用评估板方案