Skip to content

Commit efa1a32

Browse files
committed
2020-01-09
1 parent 15d923f commit efa1a32

File tree

13 files changed

+160
-132
lines changed

13 files changed

+160
-132
lines changed

0096.不同的二叉搜索树/0096-不同的二叉搜索树.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ def numTrees(self, n):
44
:type n: int
55
:rtype: int
66
"""
7-
res = [0] * (n+1)
8-
res[0] = 1
9-
res[1] = 1
7+
dic = {0:1, 1:1}
8+
109
for i in range(2, n + 1):
11-
for j in range(i):
12-
res[i] += res[j] * res[i-j-1]
13-
14-
return res[n]
10+
cnt = 0
11+
for l in range(0, i):
12+
cnt += dic[l] * dic[i - 1 - l]
13+
dic[i] = cnt
14+
15+
return dic[n]

0105.从前序与中序遍历序列构造二叉树/0105-从前序与中序遍历序列构造二叉树.py

+6-14
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,10 @@ def buildTree(self, preorder, inorder):
1414
"""
1515
if not preorder:
1616
return None
17-
root_val = preorder[0]
18-
root_idx = inorder.index(root_val)
19-
20-
preorder_left = preorder[1:1 + root_idx]
21-
preorder_right = preorder[root_idx + 1:]
22-
23-
inorder_left = inorder[:root_idx]
24-
inorder_right = inorder[root_idx + 1:]
25-
26-
# print preorder_left, preorder_right, inorder_left, inorder_right
27-
root = TreeNode(root_val)
28-
root.left = self.buildTree(preorder_left, inorder_left)
29-
root.right = self.buildTree(preorder_right, inorder_right)
30-
17+
18+
root = TreeNode(preorder[0])
19+
idx = inorder.index(root.val)
20+
21+
root.left = self.buildTree(preorder[1:idx + 1], inorder[:idx])
22+
root.right = self.buildTree(preorder[idx + 1:], inorder[idx + 1:])
3123
return root

0106.从中序与后序遍历序列构造二叉树/0106-从中序与后序遍历序列构造二叉树.py

+6-14
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,11 @@ def buildTree(self, inorder, postorder):
1313
:rtype: TreeNode
1414
"""
1515
if not inorder:
16-
return None
17-
root_val = postorder[-1]
18-
root_idx = inorder.index(root_val)
19-
20-
postorder_left = postorder[:root_idx]
21-
postorder_right = postorder[root_idx:-1]
22-
23-
inorder_left = inorder[:root_idx]
24-
inorder_right = inorder[root_idx + 1:]
25-
26-
# print preorder_left, preorder_right, inorder_left, inorder_right
27-
root = TreeNode(root_val)
28-
root.left = self.buildTree(inorder_left, postorder_left)
29-
root.right = self.buildTree(inorder_right, postorder_right)
16+
return None
3017

18+
root = TreeNode(postorder[-1])
19+
idx = inorder.index(root.val)
20+
21+
root.left = self.buildTree(inorder[:idx], postorder[:idx])
22+
root.right = self.buildTree(inorder[idx + 1:], postorder[idx:-1])
3123
return root

0107.二叉树的层次遍历II/0107-二叉树的层次遍历II.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ def levelOrderBottom(self, root):
1111
:type root: TreeNode
1212
:rtype: List[List[int]]
1313
"""
14-
queue = [root]
14+
if not root:
15+
return []
16+
from collections import deque
17+
queue = deque([root])
1518
res = []
1619
while queue:
17-
next_queue = []
1820
layer = []
19-
for node in queue:
20-
if node:
21-
layer.append(node.val)
22-
next_queue += [node.left, node.right]
23-
queue = next_queue[:]
24-
if layer:
25-
res.append(layer[:])
26-
return res[::-1]
21+
for _ in range(len(queue)):
22+
cur = queue.popleft()
23+
if cur:
24+
layer.append(cur.val)
25+
queue += [cur.left, cur.right]
26+
res.append(layer)
27+
return res[:-1][::-1]

0199.二叉树的右视图/0199-二叉树的右视图.py

+14-11
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,18 @@ def rightSideView(self, root):
1111
:type root: TreeNode
1212
:rtype: List[int]
1313
"""
14+
from collections import deque
15+
if not root:
16+
return []
17+
queue = deque([root])
1418
res = []
15-
def dfs(node, depth):
16-
if not node:
17-
return
18-
if depth > len(res):
19-
res.append(node.val)
20-
dfs(node.right, depth + 1)
21-
dfs(node.left, depth +1)
22-
23-
24-
dfs(root, 1)
25-
return res
19+
while queue:
20+
tmp = None
21+
for _ in range(len(queue)):
22+
cur = queue.popleft()
23+
if cur:
24+
tmp = cur.val
25+
queue += [cur.left, cur.right]
26+
if tmp:
27+
res.append(tmp)
28+
return res

0222.完全二叉树的节点个数/0222-完全二叉树的节点个数.py

+23-6
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,26 @@ def countNodes(self, root):
1111
:type root: TreeNode
1212
:rtype: int
1313
"""
14-
def inorder(node):
15-
if not node:
16-
return []
17-
return inorder(node.left) + [node.val] + inorder(node.right)
18-
return len(inorder(root))
19-
14+
if not root:
15+
return 0
16+
17+
self.leavesCnt = 0
18+
self.height = 0
19+
self.flag = 0
20+
def dfs(node, layer):
21+
if not node or self.flag:
22+
return
23+
if not node.left and not node.right:
24+
25+
self.height = max(self.height, layer)
26+
if layer < self.height:
27+
self.flag = 1
28+
else:
29+
self.leavesCnt += 1
30+
return
31+
dfs(node.left, layer + 1)
32+
dfs(node.right, layer + 1)
33+
34+
dfs(root, 0)
35+
# print self.leavesCnt
36+
return self.leavesCnt + sum([2 ** i for i in range(self.height)] )
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
# Definition for a Node.
33
class Node(object):
4-
def __init__(self, val, children):
4+
def __init__(self, val=None, children=None):
55
self.val = val
66
self.children = children
77
"""
@@ -13,20 +13,17 @@ def levelOrder(self, root):
1313
"""
1414
if not root:
1515
return []
16-
nodes = [root]
17-
node_val = list(list())
18-
self.generate(nodes, node_val)
19-
return node_val
20-
21-
def generate(self, nodes, node_val):
22-
new_node = []
23-
new_node_val = []
24-
for node in nodes:
25-
for leaf in node.children:
26-
new_node.append(leaf)
27-
new_node_val.append(node.val)
28-
node_val.append(new_node_val)
29-
if len(new_node) == 0:
30-
return
31-
self.generate(new_node, node_val)
32-
16+
from collections import deque
17+
queue = deque([root])
18+
res = []
19+
while queue:
20+
layer = []
21+
for _ in range(len(queue)):
22+
cur = queue.popleft()
23+
if cur:
24+
layer.append(cur.val)
25+
for child in cur.children:
26+
queue.append(child)
27+
res.append(layer)
28+
29+
return res

0637.二叉树的层平均值/0637-二叉树的层平均值.py

+13-17
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,18 @@ def averageOfLevels(self, root):
1111
:type root: TreeNode
1212
:rtype: List[float]
1313
"""
14+
from collections import deque
1415
if not root:
1516
return []
16-
next_layer = [root.left, root.right]
17-
result = [float(root.val)]
18-
19-
while(next_layer):
20-
temp_next_layer = list()
21-
layer_value = list()
22-
for node in next_layer:
23-
if not node:
24-
continue
25-
temp_next_layer.append(node.left)
26-
temp_next_layer.append(node.right)
27-
layer_value.append(node.val)
28-
if layer_value:
29-
result.append(sum(layer_value) / float(len(layer_value)))
30-
next_layer = temp_next_layer
31-
return result
32-
17+
queue = deque([root])
18+
res = []
19+
while queue:
20+
layer = []
21+
for _ in range(len(queue)):
22+
cur = queue.popleft()
23+
if cur:
24+
layer.append(cur.val)
25+
queue += [cur.left, cur.right]
26+
if layer:
27+
res.append(sum(layer) * 1.0 / len(layer))
28+
return res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution(object):
9+
def trimBST(self, root, L, R):
10+
"""
11+
:type root: TreeNode
12+
:type L: int
13+
:type R: int
14+
:rtype: TreeNode
15+
"""
16+
if not root:
17+
return None
18+
19+
root.left = self.trimBST(root.left, L, R)
20+
root.right = self.trimBST(root.right, L, R)
21+
22+
if root.val < L:
23+
return root.right
24+
if root.val > R:
25+
return root.left
26+
return root

0897.递增顺序查找树/0897-递增顺序查找树.py

+19-21
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,24 @@ def increasingBST(self, root):
1111
:type root: TreeNode
1212
:rtype: TreeNode
1313
"""
14-
preorder = list()
15-
16-
def pre_order(root):
17-
if not root:
18-
return
19-
pre_order(root.left)
20-
preorder.append(root.val)
21-
pre_order(root.right)
22-
23-
pre_order(root)
24-
dummy = TreeNode(0)
25-
for i, node in enumerate(preorder):
14+
if not root:
15+
return root
16+
new_root = TreeNode(-1)
2617

27-
temp = TreeNode(node)
28-
temp.left = None
29-
temp.right = None
30-
if i == 0:
31-
dummy.right = temp
32-
cur = temp
18+
cur, stack = root, []
19+
parent = None
20+
while cur or stack:
21+
if cur:
22+
stack.append(cur)
23+
cur = cur.left
3324
else:
34-
cur.right = temp
35-
cur = temp
36-
return dummy.right
25+
cur = stack.pop()
26+
cur.left = None
27+
if not parent:
28+
parent = cur
29+
new_root.right = parent
30+
else:
31+
parent.right = cur
32+
parent = cur
33+
cur = cur.right
34+
return new_root.right

0965.单值二叉树/0965-单值二叉树.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def isUnivalTree(self, root):
1111
:type root: TreeNode
1212
:rtype: bool
1313
"""
14-
if not root or (not root.left and not root.right):
14+
if not root:
1515
return True
1616
left = not root.left or (self.isUnivalTree(root.left) and root.val == root.left.val)
1717
right = not root.right or (self.isUnivalTree(root.right) and root.val == root.right.val)

0979.在二叉树中分配硬币/0979-在二叉树中分配硬币.py

+6-13
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,13 @@ def distributeCoins(self, root):
1212
:rtype: int
1313
"""
1414
self.res = 0
15-
1615
def dfs(node):
1716
if not node:
18-
return
19-
20-
if node.left:
21-
dfs(node.left)
22-
node.val += node.left.val - 1
23-
if node.right:
24-
dfs(node.right)
25-
node.val += node.right.val - 1
26-
27-
self.res += abs(node.val - 1)
28-
29-
17+
return 0
18+
l = dfs(node.left)
19+
r = dfs(node.right)
20+
21+
self.res += abs(l) + abs(r)
22+
return l + r + node.val - 1
3023
dfs(root)
3124
return self.res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution(object):
2+
def pathInZigZagTree(self, label):
3+
"""
4+
:type label: int
5+
:rtype: List[int]
6+
"""
7+
res = []
8+
while label > 1:
9+
res.append(label)
10+
label >>= 1
11+
label = label ^(1 << (label.bit_length() - 1)) - 1
12+
return [1] + res[::-1]

0 commit comments

Comments
 (0)