Skip to content

Commit 5a408b0

Browse files
committed
Runtime: 44 ms (Top 99.57%) | Memory: 18.50 MB (Top 5.17%)
1 parent 0230db5 commit 5a408b0

File tree

1 file changed

+56
-28
lines changed

1 file changed

+56
-28
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,62 @@
1+
// Runtime: 44 ms (Top 99.57%) | Memory: 18.50 MB (Top 5.17%)
2+
3+
from collections import deque
4+
15
class CBTInserter:
26

3-
def __init__(self, root: Optional[TreeNode]):
7+
8+
def __init__(self, root: TreeNode):
9+
410
self.root = root
5-
self.queue = Queue()
6-
self.queue.put(self.root)
7-
self.parent_of_last_inserted = None
8-
9-
def insert(self, val: int) -> int:
10-
if self.parent_of_last_inserted is not None and self.parent_of_last_inserted.right is None:
11-
self.parent_of_last_inserted.right = TreeNode(val)
12-
self.queue.put(self.parent_of_last_inserted.right)
13-
return self.parent_of_last_inserted.val
14-
15-
while not self.queue.empty():
16-
node = self.queue.get()
17-
if node.left is None:
18-
node.left = TreeNode(val)
19-
self.queue.put(node.left)
20-
self.parent_of_last_inserted = node
21-
return node.val
22-
else:
23-
self.queue.put(node.left)
24-
if node.right is None:
25-
node.right = TreeNode(val)
26-
self.queue.put(node.right)
27-
self.parent_of_last_inserted = node
28-
return node.val
29-
else:
30-
self.queue.put(node.right)
11+
12+
self.parent_keeper = deque([root])
13+
14+
while True:
15+
16+
cur = self.parent_keeper[0]
17+
18+
if cur:
19+
20+
if cur.left:
21+
22+
self.parent_keeper.append( cur.left )
23+
24+
if cur.right:
25+
26+
self.parent_keeper.append( cur.right )
27+
28+
# cur is completed with two child, pop out
29+
self.parent_keeper.popleft()
30+
31+
else:
32+
# parent of next insertion is found, stop
33+
break
34+
35+
else:
36+
# parent of next insertion is found, stop
37+
break
38+
3139

3240

33-
def get_root(self) -> Optional[TreeNode]:
41+
def insert(self, v: int) -> int:
42+
43+
parent = self.parent_keeper[0]
44+
45+
# Insert with leftward compact, to meet the definition of complete binary tree
46+
47+
if not parent.left:
48+
parent.left = TreeNode( v )
49+
self.parent_keeper.append( parent.left )
50+
else:
51+
parent.right = TreeNode( v )
52+
self.parent_keeper.append( parent.right )
53+
54+
# current parent is completed with two child now, pop parent from parent keeper on the head
55+
self.parent_keeper.popleft()
56+
57+
return parent.val
58+
59+
60+
def get_root(self) -> TreeNode:
61+
3462
return self.root

0 commit comments

Comments
 (0)