📜  要删除的最小节点数,这样子树的节点数不会超过 K 个(1)

📅  最后修改于: 2023-12-03 15:41:33.388000             🧑  作者: Mango

题目:要删除的最小节点数,这样子树的节点数不会超过 K 个

题目描述

给定一棵二叉树,要求删除最少的节点,使得每一个子树中的节点数都不超过 K。请你返回最少需要删除的节点数。

示例

输入:root = [1,2,3,4,5,6,7], k = 3

输出:2

解释:树如下所示,删除节点 1 和节点 2 后所有子树的节点数都不超过 3 个。

          1
        /   \
       2     3
     /  \   / \
    4   5  6   7
解题思路

首先需要遍历整棵树,计算每一个子树的节点数。然后,递归的进行处理。对于根节点,如果它的左/右子树的节点数大于 K 的话,那么就需要删除多余的节点。删除过程需要递归进行处理。

算法步骤
  1. 遍历整棵树,计算每个子树的节点数。
  2. 对于根节点,如果它的左/右子树节点数大于 K,那么就需要对其子树进行删除操作。
  3. 在删除节点操作时,需要递归进行处理。
时间复杂度

树的节点数为 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