📅  最后修改于: 2023-12-03 15:41:33.388000             🧑  作者: Mango
给定一棵二叉树,要求删除最少的节点,使得每一个子树中的节点数都不超过 K。请你返回最少需要删除的节点数。
输入:root = [1,2,3,4,5,6,7], k = 3
输出:2
解释:树如下所示,删除节点 1 和节点 2 后所有子树的节点数都不超过 3 个。
1
/ \
2 3
/ \ / \
4 5 6 7
首先需要遍历整棵树,计算每一个子树的节点数。然后,递归的进行处理。对于根节点,如果它的左/右子树的节点数大于 K 的话,那么就需要删除多余的节点。删除过程需要递归进行处理。
树的节点数为 n,时间复杂度为 O(nlogn)。
递归调用的深度为树的高度,最坏情况下会是链式结构。空间复杂度为 O(n)。
class Solution:
def __init__(self):
self.res = 0
def count_nodes(self, root):
if not root:
return 0
left_cnt = self.count_nodes(root.left)
right_cnt = self.count_nodes(root.right)
total_cnt = left_cnt + right_cnt + 1
if max(left_cnt, right_cnt) > self.k:
self.res += 1
return total_cnt
def removeNodes(self, root: TreeNode, k: int) -> int:
self.k = k
self.count_nodes(root)
return self.res