我是靠谱客的博主 勤恳茉莉,最近开发中收集的这篇文章主要介绍leetcode每日一题—834.树中距离之和,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:
给定一个无向、连通的树。树中有 N 个标记为 0…N-1 的节点以及 N-1 条边 。第 i 条边连接节点 edges[i][0] 和 edges[i][1] 。返回一个表示节点 i 与其他所有节点距离之和的列表 ans。
在这里插入图片描述
思路:
tree[i]:用来记录第i个结点的孩子节点,及其父节点
depth[i]:用来记录结点i的层次,根结点位于第0层
count[i]:用来记录结点i和 结点i的子结点 的总数
answer[0]:根节点到各结点的距离,即根结点所有子结点的层次之和,即depth列表中各元素之和
answer[child]=answer[father]+(N-count[child])-count[child]=answer[father]+N-2*count[child]
(即父结点的answer,加上少走的路,减去多走的路。在父结点的answer 基础上:少走的路,即当前结点 到 除 当前结点自身和当前结点的所有子节点 之外的所有结点 都少走了1,总共就是N-count[child]。在父结点的answer 基础上:多走的路,即当前结点的父节点 到 当前结点和当前结点的所有子结点 都多走了1,总共就是count[child]

解答:

class Solution:
    def sumOfDistancesInTree(self, N: int, edges: List[List[int]]) -> List[int]:
        tree = [[] for _ in range(N)]
        for father, child in edges:
            tree[father].append(child)
            tree[child].append(father)
        depth = [0 for _ in range(N)]
        count = [0 for _ in range(N)]

        def dfsForDepthAndCount(father, baba):
            count[father] = 1
            for child in tree[father]:
                if child != baba:
                    depth[child] = depth[father] + 1
                    dfsForDepthAndCount(child, father)
                    count[father] += count[child]


        dfsForDepthAndCount(0, -1)
        answer = [0 for _ in range(N)]
        answer[0] = sum(depth)


        def dfsForAnswer(father, baba):
            for child in tree[father]:
                if child != baba:
                    answer[child] = answer[father] + N - 2 * count[child]
                    dfsForAnswer(child, father)

        dfsForAnswer(0, -1)
        return answer

最后

以上就是勤恳茉莉为你收集整理的leetcode每日一题—834.树中距离之和的全部内容,希望文章能够帮你解决leetcode每日一题—834.树中距离之和所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部