Skip to content

Commit 6d6440e

Browse files
authored
fix: child node for NOT operation can be either side (minimum-flips-in-binary-tree-to-get-result) (#79)
1 parent f5cf9c5 commit 6d6440e

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

problems/minimum_flips_in_binary_tree_to_get_result/minimum_flips_in_binary_tree_to_get_result.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,13 @@ int minimumFlips(TreeNode* root, bool result) {
3030
return {min({left_false + right_false, left_true + right_true}),
3131
min({left_true + right_false, left_false + right_true})};
3232
} else if (x == 5) { // NOT
33-
return {left_true, left_false};
33+
if (node->left && !node->right) {
34+
return {left_true, left_false};
35+
} else if (!node->left && node->right) {
36+
return {right_true, right_false};
37+
} else {
38+
return {1 << 30, 1 << 30}; // Invalid operation
39+
}
3440
} else {
3541
return {1 << 30, 1 << 30}; // Invalid operation
3642
}

problems/minimum_flips_in_binary_tree_to_get_result/minimum_flips_in_binary_tree_to_get_result.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ def dfs(node: Optional[TreeNode]) -> Tuple[int, int]:
3939
min(left_false + right_true, left_true + right_false),
4040
)
4141
elif x == 5: # NOT
42-
return (left_true, left_false)
42+
if node.left and not node.right:
43+
return left_true, left_false
44+
elif not node.left and node.right:
45+
return right_true, right_false
46+
else:
47+
return inf, inf # Invalid operation
4348
else:
4449
raise ValueError(f"Unknown operation: {x}")
4550

problems/minimum_flips_in_binary_tree_to_get_result/minimum_flips_in_binary_tree_to_get_result_test.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,5 +95,13 @@ INSTANTIATE_TEST_SUITE_P(
9595
MinimumFlipsCase{.test_name = "NotGateFlipToFalse",
9696
.root = new TreeNode(5, new TreeNode(0), nullptr),
9797
.result = false,
98-
.expected = 1}),
98+
.expected = 1},
99+
MinimumFlipsCase{
100+
.test_name = "ComplexXorTreeWithNotRightChild",
101+
.root = new TreeNode(
102+
4, new TreeNode(0),
103+
new TreeNode(2, new TreeNode(0),
104+
new TreeNode(5, nullptr, new TreeNode(5, nullptr, new TreeNode(1))))),
105+
.result = true,
106+
.expected = 0}),
99107
[](const ::testing::TestParamInfo<MinimumFlipsCase> &info) { return info.param.test_name; });

problems/minimum_flips_in_binary_tree_to_get_result/minimum_flips_in_binary_tree_to_get_result_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@
6262
False,
6363
1,
6464
), # Complex tree: XOR(OR(1,1), AND(1,0)) = 1, flip one child to make it 0
65+
(
66+
TreeNode(
67+
4,
68+
TreeNode(0),
69+
TreeNode(
70+
2, TreeNode(0), TreeNode(5, None, TreeNode(5, None, TreeNode(1)))
71+
),
72+
),
73+
True,
74+
0,
75+
), # Complex tree: XOR(0, OR(0, NOT(NOT(1)))) = 1, already true
6576
],
6677
ids=[
6778
"leaf_0_to_true",
@@ -78,6 +89,7 @@
7889
"complex_tree_and_already_false",
7990
"complex_tree_xor_need_flip",
8091
"complex_tree_xor_to_false",
92+
"complex_xor_tree_with_not_right_child",
8193
],
8294
)
8395
def test_minimum_flips(root, result, expected):

0 commit comments

Comments
 (0)