Advertisement
Guest User

Untitled

a guest
Jul 7th, 2015
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. from itertools import cycle
  4.  
  5. class Node(object):
  6. def __init__(self, value, left=None, right=None):
  7. self.value = value
  8. self.left = left
  9. self.right = right
  10. def preorder(self, shape=False):
  11. if self.left is None and self.right is None:
  12. return [0] if shape else [self.value]
  13. else:
  14. traversal = [1] if shape else [self.value]
  15. if self.left is not None:
  16. traversal.extend(self.left.preorder(shape))
  17. if self.right is not None:
  18. traversal.extend(self.right.preorder(shape))
  19. return traversal
  20. def mirror(self):
  21. if self.left is self.right is None:
  22. return
  23. temp = self.left
  24. self.left = self.right
  25. self.right = temp
  26. self.left.mirror()
  27. self.right.mirror()
  28.  
  29.  
  30. class BinaryTree(object):
  31. def __init__(self, root):
  32. self.root = root
  33.  
  34. def preorder(self):
  35. # preorder traversal, emit: 0 if leaf, 1 if internal
  36. traversal = []
  37. traversal.extend(self.root.preorder())
  38. def mirror(self):
  39. self.root.mirror()
  40. def __eq__(self, other):
  41. return self.root.preorder(shape=True) == other.root.preorder(shape=True)
  42. def __hash__(self):
  43. return str(self.root.preorder())
  44. def __repr__(self):
  45. return str(self.root.preorder())
  46.  
  47.  
  48. def build_tree(n):
  49. # n is a name generator
  50. # build full binary tree of depth 2
  51. btree = BinaryTree(Node(next(n)))
  52. btree.root.left = Node(next(n))
  53. btree.root.left.left = Node(next(n))
  54. btree.root.left.right = Node(next(n))
  55. btree.root.right = Node(next(n))
  56. btree.root.right.left = Node(next(n))
  57. btree.root.right.right = Node(next(n))
  58. return btree
  59.  
  60. def build_tree2(n):
  61. # n is a name generator
  62. # build incomplete binary tree of depth 3
  63. btree = BinaryTree(Node(next(n)))
  64. btree.root.left = Node(next(n))
  65. btree.root.left.left = Node(next(n))
  66. btree.root.left.right = Node(next(n))
  67. btree.root.left.left.left = Node(next(n))
  68. btree.root.left.left.right = Node(next(n))
  69. btree.root.right = Node(next(n))
  70. btree.root.right.left = Node(next(n))
  71. btree.root.right.right = Node(next(n))
  72. return btree
  73.  
  74. def build_tree3(n):
  75. # n is a name generator
  76. # build incomplete binary tree of depth 3
  77. btree = BinaryTree(Node(next(n)))
  78. btree.root.left = Node(next(n))
  79. btree.root.left.left = Node(next(n))
  80. btree.root.left.right = Node(next(n))
  81. btree.root.right = Node(next(n))
  82. btree.root.right.left = Node(next(n))
  83. btree.root.right.right = Node(next(n))
  84. btree.root.right.right.left = Node(next(n))
  85. btree.root.right.right.right = Node(next(n))
  86. return btree
  87.  
  88. def compare_trees(bt1, bt2):
  89. print "bt1: {}".format(bt1)
  90. print "bt2: {}".format(bt2)
  91. print "bt1 and bt2 are " + "equal" if bt1 == bt2 else "different"
  92.  
  93. def node_letter():
  94. for letter in cycle(xrange(ord('A'), ord('Z'))):
  95. yield chr(letter)
  96.  
  97. def main():
  98. n = node_letter()
  99. bt1 = build_tree(n)
  100. bt2 = build_tree(n)
  101. compare_trees(bt1, bt2)
  102.  
  103. bt3 = build_tree2(n)
  104. bt4 = build_tree3(n)
  105. compare_trees(bt3, bt4)
  106.  
  107. bt3.mirror()
  108. compare_trees(bt3, bt4)
  109.  
  110. if __name__=="__main__":
  111. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement