Skip to content

Commit 0e5f71d

Browse files
committed
no message
1 parent d63b770 commit 0e5f71d

4 files changed

+93
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
Time: O(N), since we need to go through all the nodes.
3+
Space: O(LogN) for recursion stack. (if the tree is balanced). This do not take the output into account.
4+
"""
5+
class Solution:
6+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
7+
def helper(node, level):
8+
if not node: return
9+
if level==len(ans): ans.append([])
10+
ans[level].append(node.val)
11+
helper(node.left, level+1)
12+
helper(node.right, level+1)
13+
14+
ans = []
15+
helper(root, 0)
16+
17+
return ans
18+
19+
20+
"""
21+
Time: O(N), since we need to go through all the nodes.
22+
Space: O(N) for queue.
23+
"""
24+
class Solution:
25+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
26+
if not root: return []
27+
28+
q = collections.deque([(root, 0)])
29+
ans = []
30+
31+
while q:
32+
node, level = q.popleft()
33+
34+
if level==len(ans): ans.append([])
35+
ans[level].append(node.val)
36+
if node.left: q.append((node.left, level+1))
37+
if node.right: q.append((node.right, level+1))
38+
39+
return ans
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
Recursive
3+
Time: O(LogN) if the tree is balanced.
4+
Space: O(LogN) for the recursion stack.
5+
"""
6+
class Solution:
7+
def lowestCommonAncestor(self, node: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
8+
if q.val<=node.val<=p.val or p.val<=node.val<=q.val:
9+
return node
10+
elif q.val<node.val and p.val<node.val:
11+
return self.lowestCommonAncestor(node.left, p, q)
12+
elif node.val<q.val and node.val<p.val:
13+
return self.lowestCommonAncestor(node.right, p, q)
14+
15+
16+
"""
17+
Iterative
18+
Time: O(LogN) if the tree is balanced.
19+
Space: O(1).
20+
"""
21+
class Solution:
22+
def lowestCommonAncestor(self, node: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
23+
while not (q.val<=node.val<=p.val or p.val<=node.val<=q.val):
24+
if q.val<node.val and p.val<node.val:
25+
node = node.left
26+
elif node.val<q.val and node.val<p.val:
27+
node = node.right
28+
return node

problems/python3/same-tree.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
Time: O(N)
3+
Space: O(LogN) if the tree is balanced.
4+
"""
5+
class Solution:
6+
def isSameTree(self, node1: Optional[TreeNode], node2: Optional[TreeNode]) -> bool:
7+
if not node1 and not node2:
8+
return True
9+
10+
if (not node1 and node2) or (node1 and not node2):
11+
return False
12+
13+
if node1.val!=node2.val:
14+
return False
15+
16+
return self.isSameTree(node1.left, node2.left) and self.isSameTree(node1.right, node2.right)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
3+
if not root or not subRoot: return root==subRoot
4+
if self.isSame(root, subRoot): return True
5+
return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
6+
7+
def isSame(self, p, q):
8+
if not p or not q: return p==q
9+
if p.val!=q.val: return False
10+
return self.isSame(p.left, q.left) and self.isSame(p.right, q.right)

0 commit comments

Comments
 (0)