[leetcode] 366. Find Leaves of Binary Tree @ python

原题

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:

  1. Removing the leaves [4,5,3] would result in this tree:

       1
      / 
     2          
    
  2. Now removing the leaf [2] would result in this tree:

       1          
    
  3. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值