Skip to content

Commit 6324c60

Browse files
committed
init
1 parent 7388435 commit 6324c60

File tree

126 files changed

+8825
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+8825
-1
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,6 @@ cython_debug/
157157
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158158
# and can be added to the global gitignore or merged into this file. For a more nuclear
159159
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
160-
#.idea/
160+
.idea/
161+
.DS_Store
162+
**/.DS_Store

README.md

+531
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque
8+
class Solution:
9+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
10+
res = []
11+
if not root:
12+
return root
13+
queue = deque([root])
14+
while queue:
15+
level_count = len(queue)
16+
cur_level = []
17+
for _ in range(level_count):
18+
node = queue.popleft()
19+
cur_level.append(node.val)
20+
for child in [node.left, node.right]:
21+
if child:
22+
queue.append(child)
23+
res.append(cur_level)
24+
return res
25+
26+
# time O(n), due to traversal
27+
# space O(n), queue can have a size of n/2 or the list's size to store nodes
28+
# using tree and bfs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque
8+
class Solution:
9+
def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
10+
res = []
11+
if not root:
12+
return res
13+
queue = deque([root])
14+
while queue:
15+
level_count = len(queue)
16+
cur_level = []
17+
for _ in range(level_count):
18+
node = queue.popleft()
19+
cur_level.append(node.val)
20+
for child in [node.left, node.right]:
21+
if child:
22+
queue.append(child)
23+
if len(res) % 2 == 0:
24+
res.append(cur_level)
25+
else:
26+
res.append(cur_level[:: - 1])
27+
return res
28+
29+
# time O(n), due to traverse
30+
# space O(n), due to queue's size (tree diameter or last level)
31+
# using tree and bfs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque
8+
class Solution:
9+
def maxDepth(self, root: Optional[TreeNode]) -> int:
10+
if not root:
11+
return 0
12+
queue = deque([(root, 1)])
13+
while queue:
14+
node, level = queue.popleft()
15+
for child in [node.left, node.right]:
16+
if child:
17+
queue.append((child, level + 1))
18+
return level
19+
20+
# time O(n), due to bfs
21+
# space O(n), due to queue's size, it can be n/2 in a balanced tree's deepest level
22+
# using tree and bfs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque
8+
class Solution:
9+
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
10+
res = []
11+
if not root:
12+
return res
13+
queue = deque([root])
14+
while queue:
15+
level_count = len(queue)
16+
for i in range(level_count):
17+
node = queue.popleft()
18+
if i == level_count - 1:
19+
res.append(node.val)
20+
for child in [node.left, node.right]:
21+
if child:
22+
queue.append(child)
23+
return res
24+
25+
# time O(n), due to traverse
26+
# space O(n), due to queue's size (tree diameter or last level)
27+
# using tree and bfs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque
8+
class Solution:
9+
def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:
10+
start_node = None
11+
node_parent = {root: None}
12+
queue = deque([root])
13+
while queue:
14+
node = queue.popleft()
15+
if node.val == start:
16+
start_node = node
17+
for child in [node.left, node.right]:
18+
if child:
19+
queue.append(child)
20+
node_parent[child] = node
21+
22+
queue = deque([(start_node, 0)])
23+
visited = {start_node.val}
24+
while queue:
25+
node, distance = queue.popleft()
26+
for next_node in [node.left, node.right, node_parent[node]]:
27+
if next_node and next_node.val not in visited:
28+
queue.append((next_node, distance + 1))
29+
visited.add(next_node.val)
30+
return distance
31+
32+
# time O(n)
33+
# space O(n)
34+
# using tree and bfs and build child_parent hashmap
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque
8+
class Solution:
9+
def reverseOddLevels(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
10+
queue = deque([root])
11+
level = 1
12+
while queue:
13+
level_count = len(queue)
14+
cur_level = []
15+
for _ in range(level_count):
16+
node = queue.popleft()
17+
if level % 2 == 0:
18+
cur_level.append(node)
19+
for child in [node.left, node.right]:
20+
if child:
21+
queue.append(child)
22+
23+
left, right = 0, len(cur_level) - 1
24+
while left < right:
25+
cur_level[left].val, cur_level[right].val = cur_level[right].val, cur_level[left].val
26+
left += 1
27+
right -= 1
28+
29+
level += 1
30+
31+
return root
32+
33+
# time O(n)
34+
# space O(n)
35+
# using tree and bfs and two pointers
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque, defaultdict
8+
class Solution:
9+
def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
10+
if not root:
11+
return []
12+
queue = deque([(root, 0)])
13+
col_vals = defaultdict(list)
14+
min_col = float('inf')
15+
max_col = float('-inf')
16+
while queue:
17+
node, col = queue.popleft()
18+
col_vals[col].append(node.val)
19+
min_col = min(min_col, col)
20+
max_col = max(max_col, col)
21+
if node.left:
22+
queue.append((node.left, col - 1))
23+
if node.right:
24+
queue.append((node.right, col + 1))
25+
26+
res = []
27+
for col in range(min_col, max_col + 1):
28+
res.append(col_vals[col][:])
29+
return res
30+
31+
# time O(n), due to traverse
32+
# space O(n), due to hashmap
33+
# using tree and bfs and hashmap and assign coordinates
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
class Solution:
8+
def addOneRow(self, root: Optional[TreeNode], val: int, depth: int) -> Optional[TreeNode]:
9+
if not root:
10+
return root
11+
12+
if depth == 1:
13+
return TreeNode(val=val, left=root)
14+
15+
queue = deque([(root, 1)])
16+
while queue:
17+
level_count = len(queue)
18+
for _ in range(level_count):
19+
node, level = queue.popleft()
20+
if level == depth - 1:
21+
node.left = TreeNode(val=val, left=node.left)
22+
node.right = TreeNode(val=val, right=node.right)
23+
else:
24+
for child in [node.left, node.right]:
25+
if child:
26+
queue.append((child, level + 1))
27+
return root
28+
29+
# time O(n)
30+
# space O(n)
31+
# using tree and bfs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque
8+
class Solution:
9+
def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
10+
res = 0
11+
queue = deque([(root, 1)])
12+
while queue:
13+
level_count = len(queue)
14+
cur_level = []
15+
for _ in range(level_count):
16+
node, idx = queue.popleft()
17+
cur_level.append(idx)
18+
if node.left:
19+
queue.append((node.left, idx * 2))
20+
if node.right:
21+
queue.append((node.right, idx * 2 + 1))
22+
res = max(res, cur_level[- 1] - cur_level[0] + 1)
23+
return res
24+
25+
# time O(n)
26+
# space O(n), due to queue
27+
# using tree and bfs and assign idx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""
2+
# Definition for Employee.
3+
class Employee:
4+
def __init__(self, id: int, importance: int, subordinates: List[int]):
5+
self.id = id
6+
self.importance = importance
7+
self.subordinates = subordinates
8+
"""
9+
from collections import deque
10+
class Solution:
11+
def getImportance(self, employees: List['Employee'], id: int) -> int:
12+
id_employee = {}
13+
for e in employees:
14+
id_employee[e.id] = e
15+
16+
res = 0
17+
queue = deque([id_employee[id]])
18+
while queue:
19+
node = queue.popleft()
20+
res += node.importance
21+
for subordinate in node.subordinates:
22+
queue.append(id_employee[subordinate])
23+
return res
24+
25+
# time O(n)
26+
# space O(n)
27+
# using tree and bfs and tree's idea and building graph
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
from collections import deque
8+
class Solution:
9+
def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
10+
node_parent = {root: None}
11+
queue = deque([root])
12+
while queue:
13+
node = queue.popleft()
14+
for child in [node.left, node.right]:
15+
if child:
16+
queue.append(child)
17+
node_parent[child] = node
18+
19+
res = []
20+
queue = deque([(target, 0)])
21+
visited = {target.val}
22+
while queue:
23+
node, distance = queue.popleft()
24+
if distance == k:
25+
res.append(node.val)
26+
else:
27+
for next_node in [node.left, node.right, node_parent[node]]:
28+
if next_node and next_node.val not in visited:
29+
queue.append((next_node, distance + 1))
30+
visited.add(next_node.val)
31+
return res
32+
33+
# time O(n)
34+
# space O(n)
35+
# using tree and bfs and build child_parent hashmap
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
from collections import deque, defaultdict
8+
class Solution:
9+
def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:
10+
if not root:
11+
return []
12+
queue = deque([(root, 0, 0)])
13+
min_col, max_col = 0, 0
14+
col_rowvals = defaultdict(list)
15+
while queue:
16+
node, r, c = queue.popleft()
17+
min_col, max_col = min(min_col, c), max(max_col, c)
18+
col_rowvals[c].append((r, node.val))
19+
if node.left:
20+
queue.append((node.left, r + 1, c - 1))
21+
if node.right:
22+
queue.append((node.right, r + 1, c + 1))
23+
res = []
24+
for c in range(min_col, max_col + 1):
25+
res.append([v for r, v in sorted(col_rowvals[c])])
26+
return res
27+
28+
# time O(n + k * (n/k)log(n/k)), k is the number of cols
29+
# space O(n), due to queue's max size (number of leaf nodes)
30+
# using tree and bfs and hashmap and sort and assign coordinates

0 commit comments

Comments
 (0)