Skip to content

Commit 15d923f

Browse files
committedJan 9, 2020
2020-01-08
1 parent ac06b23 commit 15d923f

File tree

11 files changed

+144
-115
lines changed

11 files changed

+144
-115
lines changed
 

‎0094.二叉树的中序遍历/0094-二叉树的中序遍历.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,15 @@ def inorderTraversal(self, root):
1111
:type root: TreeNode
1212
:rtype: List[int]
1313
"""
14-
stack = []
15-
cur = root
16-
res = []
14+
if not root:
15+
return []
16+
cur, stack, res = root, [], []
1717
while cur or stack:
1818
if cur:
1919
stack.append(cur)
20-
cur = cur.left
20+
cur = cur.left
2121
else:
2222
cur = stack.pop()
2323
res.append(cur.val)
24-
cur = cur.right
25-
return res
26-
24+
cur = cur.right
25+
return res

‎0108.将有序数组转换为二叉搜索树/0108-将有序数组转换为二叉搜索树.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ def sortedArrayToBST(self, nums):
1313
"""
1414
if not nums:
1515
return None
16-
l = len(nums)
17-
root = TreeNode(nums[l // 2])
18-
root.left = self.sortedArrayToBST(nums[:l//2])
19-
root.right = self.sortedArrayToBST(nums[l//2 + 1:])
16+
rootIdx = len(nums)//2
17+
rootVal = nums[rootIdx]
18+
19+
root = TreeNode(rootVal)
20+
root.left = self.sortedArrayToBST(nums[:rootIdx])
21+
root.right = self.sortedArrayToBST(nums[rootIdx + 1:])
22+
2023
return root

‎0114.二叉树展开为链表/0114-二叉树展开为链表.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ def flatten(self, root):
1212
:rtype: None Do not return anything, modify root in-place instead.
1313
"""
1414
if not root:
15-
return None
16-
if not root.left and not root.right:
1715
return root
18-
1916
self.flatten(root.left)
2017
self.flatten(root.right)
21-
ltree, rtree = root.left, root.right
22-
root.right = ltree
18+
19+
tmp = root.right
20+
root.right = root.left
2321
root.left = None
24-
p = root
25-
while p.right:
26-
p = p.right
27-
p.right = rtree
22+
23+
node = root
24+
while node.right:
25+
node = node.right
26+
node.right = tmp
27+

‎0145.二叉树的后序遍历/0145-二叉树的后序遍历.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@ def postorderTraversal(self, root):
1111
:type root: TreeNode
1212
:rtype: List[int]
1313
"""
14-
stack = [root]
15-
res = []
14+
# left right mid
15+
# mid right left [::-1]
16+
stack, res = [root], []
1617
while stack:
1718
cur = stack.pop()
1819
if cur:
1920
res.append(cur.val)
2021
stack.append(cur.left)
2122
stack.append(cur.right)
22-
return res[::-1]
23+
return res[::-1]
24+
25+

‎0173.二叉搜索树迭代器/0173-二叉搜索树迭代器.py

+14-9
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,32 @@ def __init__(self, root):
1111
"""
1212
:type root: TreeNode
1313
"""
14+
self.stack = []
15+
self.cur = root
1416

15-
def inorder(node):
16-
if not node:
17-
return []
18-
return inorder(node.left) + [node.val] + inorder(node.right)
19-
self.l = inorder(root)
20-
self.idx = 0
2117
def next(self):
2218
"""
2319
@return the next smallest number
2420
:rtype: int
2521
"""
26-
self.idx += 1
27-
return self.l[self.idx - 1]
22+
while self.cur or self.stack:
23+
if self.cur:
24+
self.stack.append(self.cur)
25+
self.cur = self.cur.left
26+
else:
27+
self.cur = self.stack.pop()
28+
res = self.cur.val
29+
self.cur = self.cur.right
30+
31+
return res
32+
2833

2934
def hasNext(self):
3035
"""
3136
@return whether we have a next smallest number
3237
:rtype: bool
3338
"""
34-
return self.idx < len(self.l)
39+
return self.cur or self.stack
3540

3641

3742
# Your BSTIterator object will be instantiated and called as such:

‎0230.二叉搜索树中第K小的元素/0230-二叉搜索树中第K小的元素.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@ def kthSmallest(self, root, k):
1212
:type k: int
1313
:rtype: int
1414
"""
15-
16-
def inorderTraversal(node):
17-
if not node:
18-
return []
19-
return inorderTraversal(node.left) + [node.val] + inorderTraversal(node.right)
20-
21-
l = inorderTraversal(root)
22-
return l[k - 1]
15+
cnt = 0
16+
cur, stack = root, []
17+
while cur or stack:
18+
if cur:
19+
stack.append(cur)
20+
cur = cur.left
21+
else:
22+
cnt += 1
23+
cur = stack.pop()
24+
if cnt == k:
25+
return cur.val
26+
cur = cur.right

‎0366.寻找完全二叉树的叶子节点/0366-寻找完全二叉树的叶子节点.py

+34-19
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,40 @@ def findLeaves(self, root):
1111
:type root: TreeNode
1212
:rtype: List[List[int]]
1313
"""
14-
from collections import defaultdict
15-
self.dic = defaultdict(list)
16-
res = []
17-
def get_Height(node):
14+
from collections import defaultdict, deque
15+
outdegree = defaultdict(int)
16+
child2parent = {root:None}
17+
leavesNodes = []
18+
def dfs(node):
1819
if not node:
19-
return -1
20-
lh = get_Height(node.left)
21-
rh = get_Height(node.right)
22-
h = max(lh, rh) + 1
23-
self.dic[h].append(node.val)
24-
return h
20+
return
21+
22+
if node.left:
23+
outdegree[node] += 1
24+
child2parent[node.left] = node
25+
dfs(node.left)
26+
if node.right:
27+
outdegree[node] += 1
28+
child2parent[node.right] = node
29+
dfs(node.right)
30+
31+
if not outdegree[node]:
32+
leavesNodes.append(node)
33+
dfs(root)
2534

26-
get_Height(root)
27-
# print self.dic
28-
h = 0
29-
while 1:
30-
if h not in self.dic:
31-
break
32-
res.append(self.dic[h])
33-
h += 1
35+
res = []
36+
queue = deque(leavesNodes)
37+
while queue:
38+
tmp = []
39+
for _ in range(len(queue)):
40+
cur = queue.popleft()
41+
tmp.append(cur.val)
42+
43+
parent = child2parent[cur]
44+
outdegree[parent] -= 1
45+
46+
if not outdegree[parent]:
47+
queue.append(parent)
48+
res.append(tmp)
3449
return res
35-
50+

‎0513.找树左下角的值/0513-找树左下角的值.py

+16-15
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,19 @@ def findBottomLeftValue(self, root):
1111
:type root: TreeNode
1212
:rtype: int
1313
"""
14-
next_layer = [root]
15-
while(next_layer):
16-
temp_next_layer = []
17-
layer_value = []
18-
for node in next_layer:
19-
if node.left:
20-
temp_next_layer.append(node.left)
21-
if node.right:
22-
temp_next_layer.append(node.right)
23-
layer_value.append(node.val)
24-
# print layer_value
25-
next_layer = temp_next_layer
26-
27-
# print layer_value
28-
return layer_value[0]
14+
#层序遍历返回最后一层第一个
15+
from collections import deque
16+
if not root:
17+
return None
18+
queue = deque([root])
19+
while queue:
20+
res = []
21+
for _ in range(len(queue)):
22+
cur = queue.popleft()
23+
res.append(cur.val)
24+
if cur.left:
25+
queue.append(cur.left)
26+
if cur.right:
27+
queue.append(cur.right)
28+
return res[0]
29+
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
"""
@@ -11,10 +11,9 @@ def maxDepth(self, root):
1111
:type root: Node
1212
:rtype: int
1313
"""
14-
result = []
1514
if not root:
1615
return 0
17-
for node in root.children:
18-
result.append(self.maxDepth(node))
19-
20-
return 1 + max(result) if result else 1
16+
res = 0
17+
for child in root.children:
18+
res = max(res, self.maxDepth(child))
19+
return 1 + res
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
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
17
class Solution(object):
28
def insertIntoBST(self, root, val):
3-
"""
4-
:type root: TreeNode
5-
:type val: int
6-
:rtype: TreeNode
7-
"""
89
if not root:
9-
return
10-
def helper(node, val):
11-
if node.val < val:
12-
if not node.right:
13-
node.right = TreeNode(val)
14-
else:
15-
helper(node.right, val)
16-
elif node.val > val:
17-
if not node.left:
18-
node.left = TreeNode(val)
19-
else:
20-
helper(node.left, val)
21-
helper(root, val)
22-
return root
10+
return TreeNode(val)
11+
node, parent = root, root
12+
while node:
13+
parent = node
14+
node = parent.left if val < parent.val else parent.right
15+
if val > parent.val:
16+
parent.right = TreeNode(val)
17+
else:
18+
parent.left = TreeNode(val)
19+
return root
20+
# class Solution(object):
21+
# def insertIntoBST(self, root, val):
22+
# """
23+
# :type root: TreeNode
24+
# :type val: int
25+
# :rtype: TreeNode
26+
# """
27+
# if not root:
28+
# return TreeNode(val)
29+
# if root.val > val:
30+
# root.left = self.insertIntoBST(root.left, val)
31+
# else:
32+
# root.right = self.insertIntoBST(root.right, val)
33+
# return root

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

+5-16
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,8 @@ def isUnivalTree(self, root):
1111
:type root: TreeNode
1212
:rtype: bool
1313
"""
14-
15-
self.value = root.val
16-
self.result = True
17-
self.generate(root)
18-
return self.result
19-
20-
def generate(self, root):
21-
if root.val != self.value:
22-
self.result = False
23-
return
24-
if not root:
25-
return
26-
if root.left:
27-
self.generate(root.left)
28-
if root.right:
29-
self.generate(root.right)
14+
if not root or (not root.left and not root.right):
15+
return True
16+
left = not root.left or (self.isUnivalTree(root.left) and root.val == root.left.val)
17+
right = not root.right or (self.isUnivalTree(root.right) and root.val == root.right.val)
18+
return left and right

0 commit comments

Comments
 (0)
Please sign in to comment.