LCP 64-二叉树灯饰
「力扣嘉年华」的中心广场放置了一个巨型的二叉树形状的装饰树。每个节点上均有一盏灯和三个开关。节点值为 0
表示灯处于「关闭」状态,节点值为 1
表示灯处于「开启」状态。每个节点上的三个开关各自功能如下:
- 开关
1
:切换当前节点的灯的状态; - 开关
2
:切换 以当前节点为根 的子树中,所有节点上的灯的状态; - 开关
3
:切换 当前节点及其左右子节点 (若存在的话) 上的灯的状态;
给定该装饰的初始状态 root
,请返回最少需要操作多少次开关,可以关闭所有节点的灯。
示例 1:
**输入:** root = [1,1,0,null,null,null,1]
**输出:** 2
**解释:** 以下是最佳的方案之一,如图所示
![](https://pic.leetcode-cn.com/1629357030-GSbzpY-b71b95bf405e3b223e00b2820a062ba4.gif)
示例 2:
**输入:** root = [1,1,1,1,null,null,1]
**输出:** 1
**解释:** 以下是最佳的方案,如图所示
![](https://pic.leetcode-cn.com/1629356950-HZsKZC-a4091b6448a0089b4d9e8f0390ff9ac6.gif)
示例 3:
**输入:** root = [0,null,0]
**输出:** 0
**解释:** 无需操作开关,当前所有节点上的灯均已关闭
提示:
1 <= 节点个数 <= 10^5
0 <= Node.val <= 1
个人赛五道题目的 视频讲解 已出炉,欢迎点赞三连,在评论区分享你对这场比赛的看法~
定义状态 (当前节点,祖先节点开关 2 的切换次数的奇偶性,父节点是否切换了开关 3),每个状态表示从当前状态出发,最少需要操作多少次开关,可以关闭子树所有节点的灯。
跑一个树形 DP。如果当前受到祖先节点的开关影响后,变成开灯状态,那么可以操作一个或三个开关:
- 操作开关 1;
- 操作开关 2;
- 操作开关 3;
- 操作开关 123;
- 这四种操作取最小值。
如果变成关灯状态,那么可以操作零个或两个开关:
- 不操作任何一个开关;
- 操作开关 12;
- 操作开关 13;
- 操作开关 23;
- 这四种操作取最小值。
1 | class Solution: |
1 | func closeLampInTree(root *TreeNode) (ans int) { |
复杂度分析
- 时间复杂度:O(n),其中 n 为二叉树的节点个数。
- 空间复杂度:O(n)。
Comments