📜  968 (1)

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

968介绍

简介

968是一道LeetCode上的题目,题目编号为968,难度为困难。

题目要求给定一棵二叉树,每颗叶子节点都要被覆盖,并且从叶子节点开始向上覆盖,每个结点有两种选择:选中或不选中。求选中最少的节点数,使得所有叶子节点都被覆盖。

解法

这道题可以使用贪心算法的思路来解决。从叶子节点开始向上遍历二叉树,对于每个节点,分为两种情况:选择该节点,或者不选择该节点。

如果选择该节点,则可以删掉它的子节点,因为子节点的状态可以由该节点代替。同时,为了保证覆盖叶子节点,需要选择与该节点相邻的节点(即父节点或兄弟节点)。

如果不选择该节点,则需要遍历该节点的子节点,找出最少的节点数量。然后,需要选择该节点的父节点或兄弟节点,以确保覆盖叶子节点。

综合考虑两种情况,可以得到以下递归式:

def dfs(node):
    if node is None:
        return [0, 0, 0] # 状态:覆盖该节点需要的最小节点数、选中该节点时需要的最小节点数、未选中该节点时需要的最小节点数
    left = dfs(node.left)
    right = dfs(node.right)
    covered = left[1] + right[1] + 1 # 覆盖该节点需要的最小节点数
    selected = min(covered, left[0] + right[2], left[2] + right[0]) #选中该节点时需要的最小节点数
    unselected = left[1] + right[1] #未选中该节点时需要的最小节点数
    return [covered, selected, unselected]
总结

本篇介绍了LeetCode上的968题,题目要求在给定二叉树的情况下,选择最小数量的节点,使得所有叶子节点都能被覆盖。使用贪心算法来解决该问题,从叶子节点向上遍历二叉树,分情况求解每个节点的最小节点数量。