Skip to content

Commit a690e20

Browse files
committed
Update 222. 完全二叉树的节点个数.js
1 parent 79838de commit a690e20

File tree

1 file changed

+35
-6
lines changed

1 file changed

+35
-6
lines changed

222. 完全二叉树的节点个数.js

+35-6
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,41 @@
99
* @param {TreeNode} root
1010
* @return {number}
1111
*/
12-
var countNodes = function(root) {
13-
function dfs(node) {
14-
if (!node) {
15-
return 0;
12+
var countNodes = function (root) {
13+
function isExist(level, k) {
14+
let bits = 1 << (level - 1);
15+
let node = root;
16+
while (node && bits) {
17+
if (k & bits) {
18+
node = node.right;
19+
} else {
20+
node = node.left;
21+
}
22+
bits = bits >> 1;
1623
}
17-
return 1 + dfs(node.left) + dfs(node.right);
24+
return node;
1825
}
19-
return dfs(root);
26+
27+
if (!root) {
28+
return 0;
29+
}
30+
31+
let level = 0;
32+
let node = root;
33+
while (node.left) {
34+
level++;
35+
node = node.left;
36+
}
37+
38+
let l = 1 << level;
39+
let r = (1 << (level + 1)) - 1;
40+
while (l < r) {
41+
const mid = Math.ceil((l + r) / 2);
42+
if (isExist(level, mid)) {
43+
l = mid;
44+
} else {
45+
r = mid - 1;
46+
}
47+
}
48+
return l;
2049
};

0 commit comments

Comments
 (0)