1080. 根到叶路径上的不足节点

发布时间 2023-04-03 22:03:19作者: zhangk1988

题目描述

给了一个二叉树,给了不足节点的定义(所有经过该节点的从跟到叶子的路径和如果都小于limt)
需要删除所有的不足节点,返回最终的根节点

f1 分治+dfs

基本分析

  1. 从树上删除一个点,怎么操作方便?父节点删除比自己删除自己方便
  2. 以上信息给了什么启示?dfs中给父节点返回自己可以删除的信息,父节点去删除自己
  3. 如果某个节点的左右子节点都是不足节点,可以推出什么?这个节点也是不足节点(不重新计算路径值)
  4. 路径和怎么进行累加?定义s是从上往下传下去时候的路径和,最开始是0,每往下走,就会累加cur.val
  5. 为什么是后序遍历?拿到左右子节点的删除信息后,才能决定父节点是不是删除。

代码

class Solution:
    def sufficientSubset(self, root: Optional[TreeNode], limit: int) -> Optional[TreeNode]:
        def dfs(cur, s, k):
            if not cur.left and not cur.right:
                return s + cur.val < k
            
            del_l, del_r = True, True
            if cur.left:
                del_l = dfs(cur.left, s + cur.val, k)
            if cur.right:
                del_r = dfs(cur.right, s + cur.val, k)
            
            if del_l:
                cur.left = None
            if del_r:
                cur.right = None
            
            return del_l and del_r
        
        del_root = dfs(root, 0, limit)
        if del_root:
            return None
        else:
            return root

总结

  1. 怎么理解递归?将s值传递下去,再从底层的return结果判断父节点的情况。
  2. 为啥在dfs之前要把删除初值设置为True?如果没有某个子树,就没法通过dfs传参设置为True,最终没法返回真实的and的结果(True and True)