a = lc+rc+1 //左节点上不安装摄像头+右节点不安装摄像头+一个当前节点安装的摄像头 b = min(a,min(la+rb,lb+ra)) //两种情况,比较当前节点安装摄像头和当前节点不安装摄像头(如果当前节点不安装摄像头,那么它的子节点中必须有一个要安装摄像头,所以一定会选择la或ra,再加上另一棵树需要摄像头的最少情况) c = min(a,lb+rb)//因为不考虑当前节点是否被监控,所以我们只需要判断两个子树需要最少摄像头的和即可(之所以和a比较是因为存在当前节点为叶子(空)节点的情况,下面会继续讨论)
classSolution { public: structstatus { int a,b,c; }; status dfs(TreeNode *node) { if(node == nullptr) { return {999999,0,0}; } auto [la,lb,lc] = dfs(node->left); auto [ra,rb,rc] = dfs(node->right); int a = lc+rc+1; int b = min(a,min(ra+lb,rb+la)); int c = min(a,lb+rb); //cout << a << b << c << endl; return {a,b,c}; } intminCameraCover(TreeNode* root){ auto [a,b,c] = dfs(root); return b; } };