Skip to content

Commit 41f5581

Browse files
updates count nodes complete tree
1 parent cb98b2b commit 41f5581

File tree

2 files changed

+71
-23
lines changed

2 files changed

+71
-23
lines changed

Diff for: src/CountCompleteTreeNodes.java

+39-10
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,46 @@
33
// S: O(log(n))
44

55
public class CountCompleteTreeNodes {
6-
private static int depth(TreeNode root) {
7-
if (root == null) return 0;
8-
return 1 + depth(root.left);
6+
public int countNodes(TreeNode root) {
7+
if (root == null) {
8+
return 0;
9+
}
10+
11+
final int depth = depthTree(root) - 1;
12+
if (depth == 0) {
13+
return 1;
14+
}
15+
16+
int left = 0, right = (int) Math.pow(2, depth) - 1, middle;
17+
while (left <= right) {
18+
middle = left + (right - left) / 2;
19+
if (exists(root, depth, middle)) left = middle + 1;
20+
else right = middle - 1;
21+
}
22+
23+
return (int) Math.pow(2, depth) - 1 + left;
924
}
1025

11-
public static int countNodes(TreeNode root) {
12-
if (root == null) return 0;
13-
int leftDepth = depth(root.left);
14-
int rightDepth = depth(root.right);
15-
return 1 + (leftDepth == rightDepth
16-
? ((1 << leftDepth) - 1) + countNodes(root.right)
17-
: countNodes(root.left) + countNodes(root.right));
26+
private static boolean exists(TreeNode root, int depth, int index) {
27+
TreeNode current = root;
28+
int value = -1;
29+
for (int i = 0 ; i < depth ; i++) {
30+
final int middle = (int) Math.pow(2, depth - 1 - i);
31+
if (index > value + middle) {
32+
current = current.right;
33+
value += middle;
34+
} else {
35+
current = current.left;
36+
}
37+
}
38+
return current != null;
39+
}
40+
41+
private static int depthTree(TreeNode root) {
42+
if (root == null) {
43+
return 0;
44+
}
45+
46+
return 1 + Math.max(depthTree(root.left), depthTree(root.right));
1847
}
1948
}

Diff for: src/HelloWorld.java

+32-13
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,44 @@
11
public class HelloWorld {
2-
private static int result = Integer.MIN_VALUE;
3-
4-
public static int maxPathSum(TreeNode root) {
5-
result = Integer.MIN_VALUE;
2+
public int countNodes(TreeNode root) {
63
if (root == null) {
74
return 0;
85
}
9-
maxSum(root);
10-
return result;
6+
7+
final int depth = depthTree(root) - 1;
8+
if (depth == 0) {
9+
return 1;
10+
}
11+
12+
int left = 0, right = (int) Math.pow(2, depth) - 1, middle;
13+
while (left <= right) {
14+
middle = left + (right - left) / 2;
15+
if (exists(root, depth, middle)) left = middle + 1;
16+
else right = middle - 1;
17+
}
18+
19+
return (int) Math.pow(2, depth) - 1 + left;
1120
}
1221

13-
private static int maxSum(TreeNode root) {
22+
private static boolean exists(TreeNode root, int depth, int index) {
23+
TreeNode current = root;
24+
int value = -1;
25+
for (int i = 0 ; i < depth ; i++) {
26+
final int middle = (int) Math.pow(2, depth - 1 - i);
27+
if (index > value + middle) {
28+
current = current.right;
29+
value += middle;
30+
} else {
31+
current = current.left;
32+
}
33+
}
34+
return current != null;
35+
}
36+
37+
private static int depthTree(TreeNode root) {
1438
if (root == null) {
1539
return 0;
1640
}
1741

18-
final int maxGainLeftSubtree = Math.max(maxSum(root.left), 0);
19-
final int maxGainRightSubtree = Math.max(maxSum(root.right), 0);
20-
final int maxPathSum = root.val + maxGainLeftSubtree + maxGainRightSubtree;
21-
result = Math.max(result, maxPathSum);
22-
23-
return Math.max(root.val + maxGainLeftSubtree, root.val + maxGainRightSubtree);
42+
return 1 + Math.max(depthTree(root.left), depthTree(root.right));
2443
}
2544
}

0 commit comments

Comments
 (0)