9 files changed

+232
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from collections import deque
2+
3+
class Solution:
4+
def levelOrder(self, root):
5+
if not root: return None
6+
7+
q = deque()
8+
q.append(root)
9+
res = []
10+
11+
while q:
12+
level = []
13+
for _ in range(len(q)):
14+
node = q.popleft()
15+
level.append(node.val)
16+
if node.left:
17+
q.append(node.left)
18+
if node.right:
19+
q.append(node.right)
20+
res.append(level)
21+
22+
return res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from collections import deque
2+
3+
class Solution:
4+
def levelOrderBottom(self, root):
5+
if not root: return None
6+
7+
q = deque()
8+
q.append(root)
9+
stack = []
10+
res = []
11+
12+
while q:
13+
level = []
14+
for _ in range(len(q)):
15+
node = q.popleft()
16+
level.append(node.val)
17+
if node.left:
18+
q.append(node.left)
19+
if node.right:
20+
q.append(node.right)
21+
stack.append(level)
22+
23+
while stack:
24+
res.append(stack.pop())
25+
26+
return res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from collections import deque
2+
3+
class Solution:
4+
def zigzagLevelOrder(self, root):
5+
if not root: return None
6+
7+
q = deque()
8+
q.append(root)
9+
res = []
10+
l_to_r = True
11+
12+
while q:
13+
level = deque()
14+
for _ in range(len(q)):
15+
node = q.popleft()
16+
17+
if l_to_r:
18+
level.append(node.val)
19+
else:
20+
level.appendleft(node.val)
21+
22+
if node.left:
23+
q.append(node.left)
24+
if node.right:
25+
q.append(node.right)
26+
27+
res.append(level)
28+
l_to_r = not l_to_r
29+
30+
return res
31+
32+
from collections import deque
33+
34+
class Solution2:
35+
def zigzagLevelOrder(self, root):
36+
if not root: return None
37+
38+
q = deque()
39+
q.append(root)
40+
direction = 1
41+
res = []
42+
43+
while q:
44+
level = [node.val for node in list(q)[::direction]]
45+
46+
for _ in range(len(q)):
47+
node = q.popleft()
48+
if node.left:
49+
q.append(node.left)
50+
if node.right:
51+
q.append(node.right)
52+
53+
res.append(level)
54+
direction *= -1
55+
56+
return res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from collections import deque
2+
3+
class Solution:
4+
def averageOfLevels(self, root):
5+
if not root: return None
6+
7+
q = deque()
8+
q.append(root)
9+
res = []
10+
11+
while q:
12+
total = 0
13+
count = len(q)
14+
for _ in range(len(q)):
15+
node = q.popleft()
16+
total += node.val
17+
if node.left:
18+
q.append(node.left)
19+
if node.right:
20+
q.append(node.right)
21+
res.append(total / count)
22+
23+
return res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from collections import deque
2+
3+
class Solution:
4+
def minDepth(self, root):
5+
if not root: return 0
6+
7+
q = deque()
8+
q.append(root)
9+
levels = 1
10+
11+
while q:
12+
for _ in range(len(q)):
13+
node = q.popleft()
14+
if not node.left and not node.right:
15+
return levels
16+
if node.left:
17+
q.append(node.left)
18+
if node.right:
19+
q.append(node.right)
20+
levels += 1
21+
22+
return levels
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def hasPathSum(self, root, sum):
3+
if not root: return False
4+
5+
new_sum = sum - root.val
6+
if not root.left and not root.right:
7+
return new_sum == 0
8+
9+
return (self.hasPathSum(root.left, new_sum)
10+
or self.hasPathSum(root.right, new_sum))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def pathSum(self, root, sum):
3+
self.res = []
4+
self.traverse(root, sum, [])
5+
return self.res
6+
7+
def traverse(self, root, sum, path):
8+
if not root: return
9+
10+
sum -= root.val
11+
path.append(root.val)
12+
if not root.left and not root.right and sum == 0:
13+
self.res.append(path.copy())
14+
else:
15+
self.traverse(root.left, sum, path)
16+
self.traverse(root.right, sum, path)
17+
path.pop()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def sumRootToLeaf(self, root):
3+
self.total = 0
4+
self.traverse(root, 0)
5+
return self.total
6+
7+
def traverse(self, root, pathSum):
8+
if not root: return
9+
10+
pathSum = (pathSum << 1) | root.val
11+
if root.left is None and root.right is None:
12+
self.total += pathSum
13+
else:
14+
self.traverse(root.left, pathSum)
15+
self.traverse(root.right, pathSum)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution:
2+
def pathSum(self, root, sum):
3+
return self.traverse(root, sum, [])
4+
5+
def traverse(self, node, target, path):
6+
if node is None: return 0
7+
8+
path.append(node.val)
9+
pathSum = 0
10+
pathCount = 0
11+
for i in range(len(path)-1, -1, -1):
12+
pathSum += path[i]
13+
if pathSum == target:
14+
pathCount += 1
15+
16+
pathCount += self.traverse(node.left, target, path)
17+
pathCount += self.traverse(node.right, target, path)
18+
19+
path.pop()
20+
return pathCount
21+
22+
class Solution2:
23+
def pathSum(self, root, sum):
24+
self.count = 0
25+
self.cache = {0: 1}
26+
self.dfs(root, 0, sum)
27+
return self.count
28+
29+
def dfs(self, node, cur_sum, sum):
30+
if not node: return
31+
32+
cur_sum += node.val
33+
if cur_sum - sum in self.cache:
34+
self.count += self.cache[cur_sum - sum]
35+
36+
self.cache[cur_sum] = self.cache.get(cur_sum, 0) + 1
37+
38+
self.dfs(node.left, cur_sum, sum)
39+
self.dfs(node.right, cur_sum, sum)
40+
41+
self.cache[cur_sum] -= 1

0 commit comments

Comments
 (0)