这道题似乎有点争议,我的解决方案卡在111/115上,也有其他人遇到和我的一样的问题。
1 class Solution: 2 def Subset(self,root,sums,limit): 3 if root == None: 4 return 0 5 temp = root.val 6 left = self.Subset(root.left,temp+sums,limit) 7 right = self.Subset(root.right,temp+sums,limit) 8 9 if root.left != None and root.left.left == None and root.left.right == None and left < limit:10 root.left = None11 if root.right != None and root.right.left == None and root.right.right == None and right < limit:12 root.right = None13 return temp + sums14 15 def sufficientSubset(self, root: TreeNode, limit: int) -> TreeNode:16 sums = self.Subset(root,0,limit)17 if root.left == None and root.right == None and sums < limit:18 return None19 else:20 return root
这道题目的主要争议出在:删掉原来的叶子节点之后,新形成的叶子节点,如果不够,是否也要被删除。
我上面的代码,是不会删除这些新叶子节点的。貌似这道题目在比赛期间是使用的和我的代码一样的判断,但是后来又改了。
这道题目描述不清楚,给的例子也不具有代表性,所以很混乱。而leetcode上这类题目其实还蛮多的,至少我是这种感觉。
给出另一种可以AC的解决方案:
1 class Solution:2 def sufficientSubset(self, root, limit):3 if root.left == root.right is None:4 return None if root.val < limit else root5 if root.left:6 root.left = self.sufficientSubset(root.left, limit - root.val)7 if root.right:8 root.right = self.sufficientSubset(root.right, limit - root.val)9 return root if root.left or root.right else None
参考:
今早看到官方发布了一个声明,对于WA的答案重新判定,算是一种补救措施吧(这道题的AC率也瞬间从不足20%提升到38%,算是比较合理的正确率)