当前位置: 首页 > 知识库问答 >
问题:

求二叉树中最大独立集的大小--为什么有缺陷的“解”不起作用?

曾泳
2023-03-14
  1. 同一级别上的所有节点相互独立。
  2. 交替级别上的所有节点彼此独立(没有父/子关系)

警告:我在考试时想出了这个,它并不漂亮,但我只是想看看我是否能至少争取到部分学分。

那么,为什么不能直接建立两个独立的集合(一个用于奇数级别,一个用于偶数级别)呢?

我的教授声称这行不通,但我不明白为什么。为什么行不通?

共有1个答案

濮献
2023-03-14

Interjay已经注意到为什么你的答案是不正确的。这个问题可以用递归算法find-max-internative来解决,在给定二叉树的情况下,该算法考虑两种情况:

  1. 如果包含根节点,什么是最大独立集?
  2. 如果不包括根节点,什么是最大独立集?

在情况1中,由于包含根节点,它的两个子节点都不能包含。因此,我们将root的孙函数的find-max-internative的值加上root的值(必须包含),并返回该值。

def find_max_independent ( A ):
    N=len(A)

    def children ( i ):
        for n in (2*i+1, 2*i+2):
            if n<N: yield n

    def gchildren ( i ):
        for child in children(i):
            for gchild in children(child):
                yield gchild

    memo=[None]*N

    def rec ( root ):
        "finds max independent set in subtree tree rooted at root. memoizes results"

        assert(root<N)

        if memo[root] != None:
            return memo[root]

        # option 'root not included': find the child with the max independent subset value
        without_root = sum(rec(child) for child in children(root))

        # option 'root included': possibly pick the root
        # and the sum of the max value for the grandchildren
        with_root =  max(0, A[root]) + sum(rec(gchild) for gchild in gchildren(root))

        val=max(with_root, without_root)
        assert(val>=0)
        memo[root]=val

        return val


    return rec(0) if N>0 else 0
tests=[
    [[1,2,3,4,5,6], 16], #1
    [[-100,2,3,4,5,6], 6], #2
    [[1,200,3,4,5,6], 200], #3
    [[1,2,3,-4,5,-6], 6], #4
    [[], 0],
    [[-1], 0],
]

for A, expected in tests:
    actual=find_max_independent(A)
    print("test: {}, expected: {}, actual: {} ({})".format(A, expected, actual, expected==actual))
test: [1, 2, 3, 4, 5, 6], expected: 16, actual: 16 (True)
test: [-100, 2, 3, 4, 5, 6], expected: 15, actual: 15 (True)
test: [1, 200, 3, 4, 5, 6], expected: 206, actual: 206 (True)
test: [1, 2, 3, -4, 5, -6], expected: 8, actual: 8 (True)
test: [], expected: 0, actual: 0 (True)
test: [-1], expected: 0, actual: 0 (True)

测试用例4

memoized算法的复杂性是O(n),因为每个节点调用一次rec(n)。这是一个使用深度优先搜索的自上而下的动态规划解决方案。

(测试用例插图由LeetCode的交互式二叉树编辑器提供)

 类似资料:
  • 我将完整子树定义为所有级别都已满且最后一个级别左对齐的树,即所有节点都尽可能左对齐,我希望找到树中最大的完整子树。 一种方法是对每个节点作为根执行这里概述的方法,这将花费O(n^2)时间。 有更好的方法吗?

  • 我们想写一个函数,它将二叉树的根作为输入,并使用类PairAns返回该树的最大值和最小值。 我在这个问题的基础案例中遇到了一些问题 我希望答案是正确的,但在所有测试用例中都出现了运行时错误。

  • 计算二叉树最大的宽度 根据带虚结点的先序序列建立二叉树,计算该二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)并输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列,其中字符*表示虚结点(对应的子树为空)。 输出格式: 对于每组测试,输出二叉树的最大宽度。输出格式为:“maxWidth: m

  • 我正在解决以下Leetcode问题:https://leetcode.com/problems/maximum-depth-of-binary-tree/solution/ 返回二叉树的最大深度。 这是我的解决方案: 由于某种原因,输出总是比预期的少一个。看看公认的解决方案,它们看起来和我的非常相似,但我似乎找不到我的解决方案出了什么问题。

  • 这道题是 LeetCode 124 题。 给定一个非空二叉树,返回其最大路径和。注意,这里的“路径”并非自顶向下的单向路径,而是二叉树中任意连通的路径,可以在任一节点开始和结束。比如对于下图的二叉树,10->12->9 是一个最大路径: -9 / \ 1 12 / \ 10 9 分析 首先定义“端点”的概念。一条路径有两个端点:起点和终点。比如上述示例中,

  • 如何确定流中对象的不同属性的最小值和最大值?我已经看到了关于如何得到同一变量的最小值和最大值的答案。我还看到了关于如何使用特定对象属性(例如)获取最小值或最大值的答案。但是我如何获得流中所有“x”属性的最小值和所有“y”属性的最大值呢? 假设我有一个Java