forked from subsr97/daily-coding-problem
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patharbitrarily-large-binary-tree.py
49 lines (39 loc) · 1.19 KB
/
arbitrarily-large-binary-tree.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"""
#116
Jane Street
Generate a finite, but an arbitrarily large binary tree quickly in O(1).
That is, generate() should return a tree whose size is unbounded but finite.
"""
import secrets
class Node:
def __init__(self, val=1, left=None, right=None):
self.val = val
self._left = left
self._right = right
self._isLeftEvaluated = False
self._isRightEvaluated = False
@property
def left(self):
if not self._isLeftEvaluated:
if secrets.SystemRandom().random() < 0.5:
self._left = Node()
self._isLeftEvaluated = True
return self._left
@property
def right(self):
if not self._isRightEvaluated:
if secrets.SystemRandom().random() < 0.5:
self._right = Node()
self._isRightEvaluated = True
return self._right
def generate():
return Node()
def traverseAndCount(node):
if node == None:
return 0
return node.val + traverseAndCount(node.left) + traverseAndCount(node.right)
def main():
largeBinaryTree = generate()
print("Generated", traverseAndCount(largeBinaryTree), "nodes.")
if __name__ == "__main__":
main()