二叉树供暖| 豆包MarsCode AI 刷题

73 阅读2分钟

二叉树供暖| 豆包MarsCode AI 刷题

题目归类

本题可以归类为树形动态规划二叉树递归问题,因为动态规划转化成贪心了。

大致思路

核心在于通过递归的方法分配最少的暖炉来覆盖整个二叉树。

为了确保最少的暖炉数量,我们在递归时需要考察节点的三种可能状态:

  1. 节点有暖炉,为自身和相邻节点供暖。
  2. 节点已被覆盖,但没有安装暖炉。
  3. 节点未被覆盖,该节点需要其父节点安装暖炉。

根据这些状态,我们设计递归函数,根据子节点状态来判断当前节点是否需要安装暖炉。最终通过一个全局计数器来统计所需的暖炉数量。

解题步骤

  1. 构建二叉树
    使用按层序输入的节点值构建二叉树。我们通过队列 q 来保存每一层节点的位置,依次为每个节点设置左子节点和右子节点。

  2. 定义三种状态
    min_heaters 函数中,用三个数值来表示节点的供暖状态:

    • 0:节点未被覆盖,需要其父节点安装暖炉。
    • 1:节点安装了暖炉。
    • 2:节点已被覆盖,但没有安装暖炉。
  3. 递归判断安装暖炉的必要性
    递归函数 min_heaters(node) 的逻辑:

    • 如果节点为空,返回状态 2 表示已被覆盖(空节点无需供暖)。

    • 检查左右子节点的状态:

      • 若有一个子节点为 0(未被覆盖),则当前节点必须安装暖炉,将当前节点状态设为 1 并计数器 res1
      • 若左右子节点都是 2(已被覆盖),则当前节点未被覆盖,返回状态 0
      • 若左右子节点之一为 1(安装了暖炉),则当前节点已经被覆盖,无需安装暖炉,返回 2
  4. 检查根节点
    因为根节点没有父节点来覆盖它,因此递归结束后需要检查根节点是否被覆盖。如果根节点返回 0,表示需要为根节点安装暖炉

时间复杂度分析

该算法的时间复杂度为 O(n),其中 n 为节点数。每个节点最多被访问一次,递归遍历树的所有节点后确定暖炉的安装数量。

空间复杂度分析

空间复杂度为 O(h),其中 h 为树的高度。递归栈空间主要依赖于树的深度,在平衡树中,递归深度最多为 logn,在退化成链的情况下为 O(n)。