题目描述
给了一个二叉树,给了不足节点的定义(所有经过该节点的从跟到叶子的路径和如果都小于limt)
需要删除所有的不足节点,返回最终的根节点
基本分析
- 从树上删除一个点,怎么操作方便?父节点删除比自己删除自己方便
- 以上信息给了什么启示?dfs中给父节点返回自己可以删除的信息,父节点去删除自己
- 如果某个节点的左右子节点都是不足节点,可以推出什么?这个节点也是不足节点(不重新计算路径值)
- 路径和怎么进行累加?定义s是从上往下传下去时候的路径和,最开始是0,每往下走,就会累加cur.val
- 为什么是后序遍历?拿到左右子节点的删除信息后,才能决定父节点是不是删除。
代码
| 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 |
总结
- 怎么理解递归?将s值传递下去,再从底层的return结果判断父节点的情况。
- 为啥在dfs之前要把删除初值设置为True?如果没有某个子树,就没法通过dfs传参设置为True,最终没法返回真实的and的结果(True and True)
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现