zoukankan      html  css  js  c++  java
  • 【leetcode】1273. Delete Tree Nodes

    题目如下:

    A tree rooted at node 0 is given as follows:

    • The number of nodes is nodes;
    • The value of the i-th node is value[i];
    • The parent of the i-th node is parent[i].

    Remove every subtree whose sum of values of nodes is zero.

    After doing so, return the number of nodes remaining in the tree. 

    Example 1:

    Input: nodes = 7, parent = [-1,0,0,1,2,2,2], value = [1,-2,4,0,-2,-1,-1]
    Output: 2

    Constraints:

    • 1 <= nodes <= 10^4
    • -10^5 <= value[i] <= 10^5
    • parent.length == nodes
    • parent[0] == -1 which indicates that 0 is the root.

    解题思路:我的方法是递归+动态规划。对于任意一个节点i,记dp[i]为其子树的和,如果j,k....n为其子节点,那么有dp[i] = dp[j] + dp[k] + .... + dp[n] + value[i]。通过递归的方式很容易可以求出每个节点的子树和,相应的可以求出哪些节点的子树和为0。再遍历这些子树的所有节点,并标记为删除的状态,最后统计出状态为删除的节点即可。

    代码如下:

    class Solution(object):
        def deleteTreeNodes(self, nodes, parent, value):
            """
            :type nodes: int
            :type parent: List[int]
            :type value: List[int]
            :rtype: int
            """
            import sys
            sys.setrecursionlimit(1000000)
            dic = {}
            for i in range(len(parent)):
                dic[parent[i]] = dic.setdefault(parent[i],[]) + [i]
            dp = [None] * nodes
            def getValue(inx):
                if inx not in dic:
                    dp[inx] = value[inx]
                    return value[inx]
                elif dp[inx] != None:
                    return dp[inx]
                count = 0
                for child in dic[inx]:
                    count += getValue(child)
                count += value[inx]
                dp[inx] = count
                return count
    
            dic_remove = {}
    
            for i in range(nodes):
                if dp[i] == None:
                    dp[i] = getValue(i)
                if dp[i] == 0: dic_remove[i] = 1
    
            delete = [0] * nodes
    
            def markDelete(inx):
                delete[inx] = 1
                if inx not in dic:
                    return
                for key in dic[inx]:
                    markDelete(key)
    
            for inx in dic_remove.iterkeys():
                markDelete(inx)
            res = sum(delete)
            return nodes - res
            
  • 相关阅读:
    如何使用VS2013进行单元测试和查看代码覆盖率
    荔枝架构演进历程读后感
    关于海尔电商峰值系统架构读后感
    苏宁易购:商品详情系统架构设计读后感
    第二阶段冲刺第四天
    第二阶段冲刺第五天
    第二阶段冲刺第三天
    第二阶段冲刺第二天
    第二阶段冲刺第一天
    第一阶段末尾
  • 原文地址:https://www.cnblogs.com/seyjs/p/11967403.html
Copyright © 2011-2022 走看看