一.题目:
给定一个二叉树,我们需要从叶子节点开始将所有的叶子节点记录并剔除,然后重复记录新的叶子节点并剔除,如此往复直至二叉树为空树.
Example:
Input: [1,2,3,4,5]
1
/ \
2 3
/ \
4 5
二.解题思路:
涉及到树,多半是要用到递归,这里我们需要设计一个递归函数,函数的输入是一个节点,分别求得该节点的左子节点和右子节点的深度,然后取较大值+1即为当前节点的深度.递归出口为当前节点不存在时返回深度0,所以深度为0的节点都是叶子节点.
具体代码如下:
def getLevel(root, dicts):
if not root:
return 0
left = getLevel(root.left, d)
right = getLevel(root.right, d)
level = 1 + max(left, right)
dicts[level].append(root.val)
return level
通过递归统计到所有节点的深度及其对应的值后,我们可以遍历字典,得到结果
整体代码如下:
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
dicts = collections.defaultdict(list)
getLevel(root, dicts)
result = []
for k in sorted(d.keys()):
res.append(d[k])
return result
三.总结
这道题考察了二叉树的深度递归,需要熟练掌握此类递归逻辑