代码随想录:监控二叉树
本题确实是由局部推全局的典型例子,一个节点的子节点状态如何,可以推断这个节点本身状态如何,直至根节点
/**
* 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 = 0;
// 0无覆盖
// 1有摄像头
// 2有覆盖
int tra(TreeNode* node) {
if (node == NULL)
return 2;
int left = tra(node->left);
int right = tra(node->right);
// 左右子节点都覆盖了,本节点可以不加摄像头,由其父节点加摄像头
if (left * right == 4)
return 0;
// 左右节点有一个无覆盖,本节点需加摄像头
if (left * right == 0) {
res++;
return 1;
}
// 左右节点有一个有摄像头,本节点不需要父节点加摄像头
if (left * right == 1 || left * right == 2)
return 2;
return -1;
}
int minCameraCover(TreeNode* root) {
if (tra(root) == 0)
res++;
// 头节点没有父节点
return res;
}
};