核心思路采用深度优先搜索(DFS)结合动态规划求解。对于树上的每个节点,定义两种状态:选择该节点或不选择该节点。通过递归计算子树的状态,自底向上得到最优解。
具体实现方法如下。对每个节点维护两个值:不选该节点时的最大亮度和选该节点时的最大亮度。状态转移关系为:若选择当前节点,则其左右子节点都不能选,亮度为当前值加上左右子树不选状态的亮度;若不选当前节点,则左右子节点可选可不选,取其最大值之和。最终答案为根节点两种状态的最大值。
由于输入采用层序遍历数组表示二叉树,可以直接在数组上进行DFS,利用索引关系访问父子节点。对于索引为i的节点,其左子节点索引为2i+1,右子节点索引为2i+2。当索引超出范围或节点值为0时,表示该位置无节点。
给定一个普通二叉树 bulbs , 我们在二叉树的节点上安装灯泡,每个灯泡都有自己的亮度值和开关,如果选择打开一个灯泡,则它相邻的父节点和子节点上的灯泡都不能被打开,计算能够获得的最大亮度总和。
假设 bulbs[ ] 是使用层序遍历存储的二叉树,其元素数值代表该对应树节点上灯泡的亮度值。
开通会员即可查看完整视频题解: 1.题目讲解 2.思路分析 3.逐行代码手写