原题
Given a binary tree, collect a tree’s nodes as if you were doing this: Collect and remove all leaves, repeat until the tree is empty.
Example:
Input: [1,2,3,4,5]
1
/ \
2 3
/ \
4 5
Output: [[4,5,3],[2],[1]]
Explanation:
-
Removing the leaves [4,5,3] would result in this tree:
1 / 2
-
Now removing the leaf [2] would result in this tree:
1
-
Now removing the leaf [1] would result in the empty tree:
[]
解法1
递归+分治法. 构建d存储每层的节点值, 当节点为空时, 为第0层, 当根节点时, 为第1层, 以此类推. 构造getLevel函数, 分别求得左右子节点的层数, 当前节点的层数为1 + max(left, right), 然后更新字典. 最后遍历字典的键, 将值加入res.
Time: O(n)
Space: O(n)
代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def findLeaves(self, root: 'TreeNode') -> 'List[List[int]]':
def getLevel(root, d):
if not root:
return 0
left = getLevel(root.left, d)
right = getLevel(root.right, d)
level = 1 + max(left, right)
d[level].append(root.val)
return level
d = collections.defaultdict(list)
getLevel(root, d)
res = []
for k in sorted(d.keys()):
res.append(d[k])
return res
解法2
同解法1
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def findLeaves(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
d = collections.defaultdict(list)
ans = []
def traverse(root):
# return the level of the nodes
if not root:
return 0
left = traverse(root.left)
right = traverse(root.right)
level = max(left, right) + 1
d[level].append(root.val)
return level
traverse(root)
for i in range(1, len(d)+1):
ans.append(d[i])
return ans