Leetcode 3331. Find Subtree Sizes After Changes

Leetcode 3331题树遍历解题思路与代码

1. 解题思路

这一题就是一个树的遍历,首先经过一次自底向上的遍历将所有的子树的父节点进行更新,然后重新二次自顶向下遍历一下记录各个子树的节点数目即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def findSubtreeSizes(self, parent: List[int], s: str) -> List[int]:
        
        graph = defaultdict(list)
        for u, v in enumerate(parent):
            graph[v].append(u)
        
        tree = deepcopy(parent)
        
        def dfs(root, closest):
            nonlocal tree
            if closest[ord(s[root]) - ord('a')] != -1:
                tree[root] = closest[ord(s[root]) - ord('a')]
            p = closest[ord(s[root]) - ord('a')]
            closest[ord(s[root]) - ord('a')] = root
            for u in graph[root]:
                dfs(u, closest)
            closest[ord(s[root]) - ord('a')] = p
            return
        
        dfs(0, [-1 for _ in range(26)])

        graph = defaultdict(list)
        for u, v in enumerate(tree):
            graph[v].append(u)
        
        ans = [0 for _ in parent]
        def dfs2(root):
            nonlocal ans
            cnt = 1
            for u in graph[root]:
                cnt += dfs2(u)
            ans[root] = cnt
            return cnt
        
        dfs2(0)
        return ans

提交代码评测得到:耗时1223ms,占用内存59.6MB。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值