给定一棵二叉树的根 root,请你考虑它所有 从根到叶的路径:从根到任何叶的路径。(所谓一个叶子节点,就是一个没有子节点的节点)
假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为「不足节点」,需要被删除。
请你删除所有不足节点,并返回生成的二叉树的根。
示例 1:
输入:root = [1,2,3,4,-99,-99,7,8,9,-99,-99,12,13,-99,14], limit = 1
输出:[1,2,3,4,null,null,7,8,9,null,14]
示例 2:
输入:root = [5,4,8,11,null,17,4,7,1,null,null,5,3], limit = 22
输出:[5,4,8,11,null,17,4,7,null,null,null,5]
示例 3:
输入:root = [5,-6,-6], limit = 0
输出:[]
提示:
给定的树有 1 到 5000 个节点
-10^5 <= node.val <= 10^5
-10^9 <= limit <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insufficient-nodes-in-root-to-leaf-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
1. 首先找到每一条从根节点到叶节点的path,计算一下path的和,如果和比limit大,说明这条path上的所有节点都safe,可以保留,用hashmap 来记录所有节点的状态, key是节点地址,val代表安不安全,0不安全,1安全
2. 再次遍历整个树,把不安全的节点置空。
class Solution(object):
def sufficientSubset(self, root, limit):
"""
:type root: TreeNode
:type limit: int
:rtype: TreeNode
"""
#打印二叉树的所有path
res = []
safe = {}
def findPath(node, tmp):
if not node:
return
tmp.append(node)
if not node.left and not node.right:
s = 0
for item in tmp:
s += item.val
if s >= limit:
for item in tmp:
safe[item] = 1
findPath(node.left, tmp)
findPath(node.right, tmp)
tmp.pop()
findPath(root, [])
def dfs2(node):
if not node:
return
if node.left and safe.get(node.left, 0) == 0:
node.left = None
if node.right and safe.get(node.right, 0) == 0:
node.right = None
dfs2(node.left)
dfs2(node.right)
dfs2(root)
return root if safe.get(root, 0) == 1 else None