-
Notifications
You must be signed in to change notification settings - Fork 0
/
표현 가능한 이진트리_v2.js
51 lines (44 loc) · 1.38 KB
/
표현 가능한 이진트리_v2.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
숫자를 이진수로 변환
앞쪽에 0을 채움
몇개까지? 길이가 2^n-1 이 될때까지
이러면 문제는 해당 트리가 valid한지 검사하는걸로 바뀜
중앙 완쪽 오른쪽 나눠서 재귀
0 하위에 1이 하나라도 있으면 실패
*/
function solution(numbers) {
const getPadAmount = (length) => {
let i;
for (i = 0; 2 ** i - 1 < length; i += 1) {}
return 2 ** i - 1;
};
const isValidTree = (tree, left, right) => {
const isAllZero = (left, right) => {
if (right - left === 1) {
return tree[left] === '0';
}
const me = Math.floor((left + right) / 2);
if (tree[me] === '1') {
return false;
}
return isAllZero(left, me) && isAllZero(me + 1, right);
};
const traverse = (left, right) => {
if (right - left === 1) {
return true;
}
const me = Math.floor((left + right) / 2);
if (tree[me] === '0') {
return isAllZero(left, me) && isAllZero(me + 1, right);
}
return traverse(left, me) && traverse(me + 1, right);
};
return traverse(left, right);
};
const canRepresentedByTree = (value) => {
const binary = value.toString(2);
const tree = binary.padStart(getPadAmount(binary.length), '0');
return isValidTree(tree, 0, tree.length);
};
return numbers.map(canRepresentedByTree).map((bool) => (bool ? 1 : 0));
}