def trees_equal(a: EvalTree, b: EvalTree) -> bool: for nodeA, nodeB in itertools.zip_longest(a.pre_order(), b.pre_order(), fillvalue=EvalTreeNode(None)): if nodeA.payload != nodeB.payload: return False return True
def test_copy(self): root = EvalTreeNode( OPERATORS['d'], EvalTreeNode(1), EvalTreeNode(OPERATORS['d'], EvalTreeNode(4), EvalTreeNode(20))) tree = EvalTree(None) tree.root = root tree.evaluate() copy = tree.copy() self.assertEqual(tree, copy) self.assertIsNot(tree, copy) for origNode, copyNode in zip(tree.pre_order(), copy.pre_order()): self.assertIsNot(origNode, copyNode) # Avoid false positives from int interning if not isinstance(origNode.value, int): self.assertIsNot(origNode.value, copyNode.value) if not isinstance(origNode.payload, int): self.assertIsNot(origNode.payload, copyNode.payload)
def tree_empty(tree: EvalTree) -> bool: for node in tree.pre_order(): if node.value is not None: return False return True