class Node:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 10
# / \
# / \
# / \
# 5 15
# / \ / \
# 3 8 13 20
# / \ / \ / \ / \
# 1 4 6 9 11 14 17 25
def buildTree():
n17 = Node(val=17)
n25 = Node(val=25)
n20 = Node(val=20, left=n17, right=n25)
n11 = Node(val=11)
n14 = Node(val=14)
n13 = Node(val=13, left=n11, right=n14)
n15 = Node(val=15, left=n13, right=n20)
n6 = Node(val=6)
n9 = Node(val=9)
n8 = Node(val=8, left=n6, right=n9)
n4 = Node(val=4)
n1 = Node(val=1)
n3 = Node(val=3, left=n1, right=n4)
n5 = Node(val=5, left=n3, right=n8)
n10 = Node(val=10, left=n5, right=n15)
return n10
class LazyExplicitStackBasedExplorer:
def __init__(self, root):
self.stack = []
self.current_node = root
self.next_value = None
def get_next_value(self):
if self.current_node is not None or len(self.stack) > 0:
self.visit_next_node()
return self.next_value
else:
return None
def visit_next_node(self):
while self.current_node is not None:
self.stack.append(self.current_node)
self.current_node = self.current_node.left
self.current_node = self.stack.pop()
self.next_value = self.current_node.val
self.current_node = self.current_node.right
class LazyGeneratorBasedExplorer:
def __init__(self, root):
self.iterator = self.visit_next_node(root)
def get_next_value(self):
try:
return next(self.iterator)
except StopIteration:
return None
def visit_next_node(self, root):
if root.left is not None:
for value in self.visit_next_node(root.left):
yield value
yield root.val
if root.right is not None:
for value in self.visit_next_node(root.right):
yield value
if __name__ == '__main__':
root = buildTree()
# explorer = LazyExplicitStackBasedExplorer(root)
explorer = LazyGeneratorBasedExplorer(root)
while True:
val = explorer.get_next_value()
if val is None:
break
print(val)
CmNsYXNzIE5vZGU6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsPTAsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSk6CiAgICAgICAgc2VsZi52YWwgPSB2YWwKICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0CiAgICAgICAgc2VsZi5yaWdodCA9IHJpZ2h0CiAjICAgICAgICAgICAgMTAKICMgICAgICAgICAvICAgICAgXAogIyAgICAgICAgLyAgICAgICAgXAogIyAgICAgICAvICAgICAgICAgIFwKICMgICAgICA1ICAgICAgICAgICAxNQogIyAgICAvICAgXCAgICAgICAvICAgIFwKICMgICAzICAgICA4ICAgICAxMyAgICAgIDIwCiAjICAvIFwgICAvICBcICAvICBcICAgIC8gIFwKICMgMSAgIDQgIDYgIDkgIDExICAxNCAgMTcgIDI1CgoKZGVmIGJ1aWxkVHJlZSgpOgogICAgbjE3ID0gTm9kZSh2YWw9MTcpCiAgICBuMjUgPSBOb2RlKHZhbD0yNSkKICAgIG4yMCA9IE5vZGUodmFsPTIwLCBsZWZ0PW4xNywgcmlnaHQ9bjI1KQoKICAgIG4xMSA9IE5vZGUodmFsPTExKQogICAgbjE0ID0gTm9kZSh2YWw9MTQpCiAgICBuMTMgPSBOb2RlKHZhbD0xMywgbGVmdD1uMTEsIHJpZ2h0PW4xNCkKCiAgICBuMTUgPSBOb2RlKHZhbD0xNSwgbGVmdD1uMTMsIHJpZ2h0PW4yMCkKCiAgICBuNiA9IE5vZGUodmFsPTYpCiAgICBuOSA9IE5vZGUodmFsPTkpCiAgICBuOCA9IE5vZGUodmFsPTgsIGxlZnQ9bjYsIHJpZ2h0PW45KQoKICAgIG40ID0gTm9kZSh2YWw9NCkKICAgIG4xID0gTm9kZSh2YWw9MSkKICAgIG4zID0gTm9kZSh2YWw9MywgbGVmdD1uMSwgcmlnaHQ9bjQpCgogICAgbjUgPSBOb2RlKHZhbD01LCBsZWZ0PW4zLCByaWdodD1uOCkKCiAgICBuMTAgPSBOb2RlKHZhbD0xMCwgbGVmdD1uNSwgcmlnaHQ9bjE1KQoKICAgIHJldHVybiBuMTAKCgpjbGFzcyBMYXp5RXhwbGljaXRTdGFja0Jhc2VkRXhwbG9yZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CiAgICAgICAgc2VsZi5zdGFjayA9IFtdCiAgICAgICAgc2VsZi5jdXJyZW50X25vZGUgPSByb290CiAgICAgICAgc2VsZi5uZXh0X3ZhbHVlID0gTm9uZQoKICAgIGRlZiBnZXRfbmV4dF92YWx1ZShzZWxmKToKICAgICAgICBpZiBzZWxmLmN1cnJlbnRfbm9kZSBpcyBub3QgTm9uZSBvciBsZW4oc2VsZi5zdGFjaykgPiAwOgogICAgICAgICAgICBzZWxmLnZpc2l0X25leHRfbm9kZSgpCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5leHRfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiB2aXNpdF9uZXh0X25vZGUoc2VsZik6CiAgICAgICAgd2hpbGUgc2VsZi5jdXJyZW50X25vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKHNlbGYuY3VycmVudF9ub2RlKQogICAgICAgICAgICBzZWxmLmN1cnJlbnRfbm9kZSA9IHNlbGYuY3VycmVudF9ub2RlLmxlZnQKCiAgICAgICAgc2VsZi5jdXJyZW50X25vZGUgPSBzZWxmLnN0YWNrLnBvcCgpCiAgICAgICAgc2VsZi5uZXh0X3ZhbHVlID0gc2VsZi5jdXJyZW50X25vZGUudmFsCiAgICAgICAgc2VsZi5jdXJyZW50X25vZGUgPSBzZWxmLmN1cnJlbnRfbm9kZS5yaWdodAoKCmNsYXNzIExhenlHZW5lcmF0b3JCYXNlZEV4cGxvcmVyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgogICAgICAgIHNlbGYuaXRlcmF0b3IgPSBzZWxmLnZpc2l0X25leHRfbm9kZShyb290KQoKICAgIGRlZiBnZXRfbmV4dF92YWx1ZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYuaXRlcmF0b3IpCiAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIHZpc2l0X25leHRfbm9kZShzZWxmLCByb290KToKICAgICAgICBpZiByb290LmxlZnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBzZWxmLnZpc2l0X25leHRfbm9kZShyb290LmxlZnQpOgogICAgICAgICAgICAgICAgeWllbGQgdmFsdWUKCiAgICAgICAgeWllbGQgcm9vdC52YWwKCiAgICAgICAgaWYgcm9vdC5yaWdodCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIHZhbHVlIGluIHNlbGYudmlzaXRfbmV4dF9ub2RlKHJvb3QucmlnaHQpOgogICAgICAgICAgICAgICAgeWllbGQgdmFsdWUKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcm9vdCA9IGJ1aWxkVHJlZSgpCiAgICAjIGV4cGxvcmVyID0gTGF6eUV4cGxpY2l0U3RhY2tCYXNlZEV4cGxvcmVyKHJvb3QpCiAgICBleHBsb3JlciA9IExhenlHZW5lcmF0b3JCYXNlZEV4cGxvcmVyKHJvb3QpCgogICAgd2hpbGUgVHJ1ZToKICAgICAgICB2YWwgPSBleHBsb3Jlci5nZXRfbmV4dF92YWx1ZSgpCgogICAgICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgICAgICBicmVhawoKICAgICAgICBwcmludCh2YWwp