968. 监控二叉树 力扣(困难) dfs 官方说DP
968. 监控二叉树
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
代码:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: int res; int dfs(TreeNode* root) { if(root==NULL) return 2; // 2:被覆盖 1:未被覆盖 0:安装监控 int left=dfs(root->left); int right=dfs(root->right); if(left==2 && right==2) return 1; // 如果左右节点,都被覆盖,root节点可以省去监控,让其父节点放监控,贪心,此时root状态就是 未被覆盖。 if(left==1 || right==1) // 如果左右节点,有一个没有被覆盖,root也必须 放监控 { res++; return 0; } if(left==0 || right==0) return 2; // 如果左右节点,安装监控,则root节点状态是 被覆盖,(可能会说另一个几点没有放监控,没有被覆盖呢,这种情况在前面第二个if中包含了) return -1; // 因为必须返回。 } int minCameraCover(TreeNode* root) { res=0; if(dfs(root)==1) res++; return res; } };