이진 트리가 있다고 가정합니다. 트리의 노드에 카메라를 배치합니다. 이제 노드의 각 카메라는 상위, 자체 및 하위를 모니터링할 수 있습니다. 트리의 모든 노드를 모니터링하는 데 필요한 최소 카메라 수를 찾아야 합니다.
따라서 입력이 다음과 같으면 -
하나의 카메라만 모든 것을 추적하기에 충분하기 때문에 출력은 1이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
Covered라고 하는 TreeNode 유형의 집합 하나를 정의합니다(트리 노드에는 왼쪽, 오른쪽 및 데이터 필드가 있음).
-
solve() 함수를 정의하면 노드, 부모,
가 사용됩니다. -
노드가 null이면 -
-
반환
-
-
해결(노드 왼쪽, 노드)
-
해결(노드 오른쪽, 노드)
-
(부모가 NULL과 같고 (노드, 노드 왼쪽, 노드 오른쪽) 아무 것도 덮이지 않으면 -
-
(1만큼 증가)
-
덮힌 부분에 노드 삽입
-
덮힌 부분에 노드의 왼쪽 삽입
-
덮힌 부분에 노드 오른쪽 삽입
-
적용 대상에 부모 삽입
-
-
기본 방법에서 다음을 수행합니다.
-
답변 :=0
-
덮힌 부분에 NULL 삽입
-
해결(루트, NULL)
-
반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; class Solution { public: set<TreeNode*> covered; int ans; int minCameraCover(TreeNode* root){ covered.clear(); ans = 0; covered.insert(NULL); solve(root, NULL); return ans; } void solve(TreeNode* node, TreeNode* parent){ if (!node) return; solve(node->left, node); solve(node->right, node); if ((parent == NULL && covered.find(node) == covered.end()) || covered.find(node->left) == covered.end() || covered.find(node- >right) == covered.end()) { ans++; covered.insert(node); covered.insert(node->left); covered.insert(node->right); covered.insert(parent); } } }; main(){ Solution ob; TreeNode *root = new TreeNode(1); root->left = new TreeNode(1); root->left->left = new TreeNode(1); root->left->right = new TreeNode(1); cout << (ob.minCameraCover(root)); }
입력
[1,1,NULL,1,1]
출력
1