# Program to show simultaneous traversal through two Python generators # Checks if two binary trees have the same inorder (symmetric order) traversal # Raphael Finkel 10/2013 # upgraded to Python3: 10/2019 # useful constant null = 'null' # tree node value # data structure: a tree is a dict with fields "left", "value", "right". def makeNode(left, value, right): # build a tree with given fields node = {} node["left"] = left node["value"] = value node["right"] = right return node # makeNode() def treeTraverse(t): # generator to traverse a binary tree if t != null: yield from treeTraverse(t["left"]) yield(t["value"]) yield from treeTraverse(t["right"]) # treeTraverse() def binEqual(tree1, tree2): # returns Boolean: do trees have same traversal? start = 'start' # initial traversal value done = 'done' # final traversal value iter1 = treeTraverse(tree1) iter2 = treeTraverse(tree2) value1 = start value2 = start while (value1 == value2) and (value1 != done): try: value1 = next(iter1) except StopIteration: value1 = done try: value2 = next(iter2) except StopIteration: value2 = done # print ("value1 is %s, value2 is %s, equal? %s") % \ # (value1, value2, value1==value2) print ('{} {} {}'.format(value1, value2, value1==value2)) return value1 == value2 # binEqual() def main(): # main program # build some trees to test tree1 = makeNode( makeNode( makeNode(null,1,null), 2, makeNode(null,3,null)), 4, makeNode(null,5,null) ) tree2 = makeNode( null, 1, makeNode( null, 2, makeNode( null, 3, makeNode( makeNode(null, 4, null), 5, null ) ) ) ) tree3 = makeNode( makeNode( makeNode(null,1,null), 2, makeNode(null,3,null)), 4, null ) # see if the trees are equal print('{}'.format(binEqual(tree1, tree2))); print('{}'.format(binEqual(tree1, tree3))); print('{}'.format(binEqual(tree3, tree1))); # main main()