二叉树供暖| 豆包MarsCode AI 刷题
题目归类
本题可以归类为树形动态规划或二叉树递归问题,因为动态规划转化成贪心了。
大致思路
核心在于通过递归的方法分配最少的暖炉来覆盖整个二叉树。
为了确保最少的暖炉数量,我们在递归时需要考察节点的三种可能状态:
- 节点有暖炉,为自身和相邻节点供暖。
- 节点已被覆盖,但没有安装暖炉。
- 节点未被覆盖,该节点需要其父节点安装暖炉。
根据这些状态,我们设计递归函数,根据子节点状态来判断当前节点是否需要安装暖炉。最终通过一个全局计数器来统计所需的暖炉数量。
解题步骤
-
构建二叉树
使用按层序输入的节点值构建二叉树。我们通过队列q来保存每一层节点的位置,依次为每个节点设置左子节点和右子节点。 -
定义三种状态
在min_heaters函数中,用三个数值来表示节点的供暖状态:0:节点未被覆盖,需要其父节点安装暖炉。1:节点安装了暖炉。2:节点已被覆盖,但没有安装暖炉。
-
递归判断安装暖炉的必要性
递归函数min_heaters(node)的逻辑:-
如果节点为空,返回状态
2表示已被覆盖(空节点无需供暖)。 -
检查左右子节点的状态:
- 若有一个子节点为
0(未被覆盖),则当前节点必须安装暖炉,将当前节点状态设为1并计数器res加1。 - 若左右子节点都是
2(已被覆盖),则当前节点未被覆盖,返回状态0。 - 若左右子节点之一为
1(安装了暖炉),则当前节点已经被覆盖,无需安装暖炉,返回2。
- 若有一个子节点为
-
-
检查根节点
因为根节点没有父节点来覆盖它,因此递归结束后需要检查根节点是否被覆盖。如果根节点返回0,表示需要为根节点安装暖炉
时间复杂度分析
该算法的时间复杂度为 O(n),其中 n 为节点数。每个节点最多被访问一次,递归遍历树的所有节点后确定暖炉的安装数量。
空间复杂度分析
空间复杂度为 O(h),其中 h 为树的高度。递归栈空间主要依赖于树的深度,在平衡树中,递归深度最多为 logn,在退化成链的情况下为 O(n)。