fork download
  1. from enum import Enum
  2.  
  3.  
  4. class Operation(Enum):
  5. AND = 0
  6. OR = 1
  7. XOR = 2
  8. VALUE = 3
  9.  
  10.  
  11. class Node:
  12. def __init__(
  13. self,
  14. operation,
  15. value,
  16. left = None,
  17. right = None,
  18. ):
  19. self.operation = operation
  20. self.value = value
  21. self.left = left
  22. self.right = right
  23.  
  24. def eval_tree(node):
  25. if node is None:
  26. raise Exception("root is None")
  27. if node.operation == Operation.VALUE:
  28. return
  29.  
  30. eval_tree(node.left)
  31. eval_tree(node.right)
  32.  
  33. if node.operation == Operation.AND:
  34. node.value = node.left.value and node.right.value
  35. elif node.operation == Operation.OR:
  36. node.value = node.left.value or node.right.value
  37. elif node.operation == Operation.XOR:
  38. node.value = node.left.value ^ node.right.value
  39.  
  40. def eval_flips(node, root_if_true, root_if_false):
  41. if node is None:
  42. raise Exception("node is None")
  43. if node.operation == Operation.VALUE:
  44. print(root_if_false if node.value else root_if_true)
  45. return
  46.  
  47. if node.operation == Operation.AND:
  48. # If rhs is false, lhs doesn't affect the result.
  49. eval_flips(node.left, root_if_true if node.right.value else root_if_false, root_if_false)
  50. # If lhs is false, rhs doesn't affect the result.
  51. eval_flips(node.right, root_if_true if node.left.value else root_if_false, root_if_false)
  52. elif node.operation == Operation.OR:
  53. eval_flips(node.left, root_if_true, root_if_true if node.right.value else root_if_false)
  54. eval_flips(node.right, root_if_true, root_if_true if node.left.value else root_if_false)
  55. elif node.operation == Operation.XOR:
  56. # متروك للطالب
  57. pass
  58.  
  59. def example1() -> Node:
  60. return Node(
  61. operation=Operation.AND,
  62. value=None,
  63. left=Node(
  64. operation=Operation.OR,
  65. value=None,
  66. left=Node(operation=Operation.VALUE, value=True),
  67. right=Node(
  68. operation=Operation.AND,
  69. value=None,
  70. left=Node(operation=Operation.VALUE, value=True),
  71. right=Node(operation=Operation.VALUE, value=False),
  72. ),
  73. ),
  74. right=Node(
  75. operation=Operation.OR,
  76. value=None,
  77. left=Node(operation=Operation.VALUE, value=True),
  78. right=Node(operation=Operation.VALUE, value=False),
  79. ),
  80. )
  81.  
  82.  
  83. def main():
  84. root = example1()
  85. eval_tree(root)
  86. eval_flips(root, True, False)
  87.  
  88.  
  89. if __name__ == "__main__":
  90. main()
Success #stdin #stdout 0.08s 15688KB
stdin
Standard input is empty
stdout
False
True
True
False
True