이진 트리가 있고 루트 노드가 깊이 0에 있고 각 깊이 k 노드의 자식이 깊이 k+1에 있다고 가정합니다.
여기서 이진 트리의 두 노드는 깊이가 같지만 부모가 다른 경우 사촌이라고 합니다.
트리의 모든 값은 고유하며 트리에 있는 두 개의 서로 다른 노드의 x 및 y 값은 고유합니다. x, y 값에 해당하는 노드가 사촌인지 확인해야 합니다.
따라서 입력이 다음과 같으면
x =5, y =4이면 출력은 true가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 맵 정의 um
-
하나의 대기열 정의 q
-
루트를 q에 삽입
-
음[x] :=음[y] :=널
-
동안(q가 비어 있지 않음) -
를 수행합니다.-
qSize :=q의 크기
-
qSize> 0인 동안(qSize를 1만큼 감소) 다음을 수행합니다. -
-
cur :=q의 첫 번째 요소
-
q에서 요소 삭제
-
curr의 왼쪽이 있으면 -
-
um이 cur의 왼쪽 값을 가지면
-
um[cur 왼쪽의 값] :=cur
-
-
그렇지 않으면
-
q에 cur의 왼쪽 삽입
-
-
um에 cur의 값이 있으면
-
um[cur 오른쪽 값] :=cur
-
-
그렇지 않으면
-
q에 cur의 오른쪽 삽입
-
-
-
um[x] 또는 um[y]가 0이 아니면 -
-
um[x]가 0이거나 um[y]가 0이거나 um[x]가 um[y]와 같으면 -
-
거짓을 반환
-
-
그렇지 않으면
-
true를 반환
-
-
-
-
-
거짓을 반환
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#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: bool isCousins(TreeNode *root, int x, int y) { unordered_map<int, TreeNode *> um; queue<TreeNode *> q; q.push(root); um[x] = um[y] = NULL; while (!q.empty()) { int qSize = q.size(); while (qSize-- > 0) { auto cur = q.front(); q.pop(); if (cur->left && cur->left->val != 0) if (um.count(cur->left->val)) um[cur->left->val] = cur; else q.push(cur->left); if (cur->right && cur->right->val != 0) if (um.count(cur->right->val)) um[cur->right->val] = cur; else q.push(cur->right); } if (um[x] or um[y]) if (!um[x] or !um[y] or um[x] == um[y]) return false; else return true; } return false; } }; main() { Solution ob; TreeNode *root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->right = new TreeNode(4); root->right->right = new TreeNode(5); cout << (ob.isCousins(root, 5, 4)); }
입력
TreeNode *root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->right = new TreeNode(4); root->right->right = new TreeNode(5); cout << (ob.isCousins(root, 5, 4));
출력
1