leetcode 834. Sum of Distances in Tree(树中的距离和)

掌控板玩板指南1:初识掌控板、扩展板、Mind+编辑器 掌控板、I/O扩展板入门 阅读详情

在这里插入图片描述
无向连接的树(不一定是二叉树),求每个节点到其他节点的距离和。
返回一个数组,数组的第i个元素就是第i个节点到其他所有节点的距离之和。

思路:

涉及无向图的构造和遍历,树的前序后序遍历,问题拆分。

能想到的最笨的办法就是以每个节点为root进行DFS遍历,这样就能求到每个节点到其他所有节点的距离。但是这样要遍历n次。

如何能在O(n)时间内解决?

先看个例子,看节点0到其他所有节点的距离

    0
   / \
  1   2
 / \
3   4

0到1,2的距离都是1,1到3,4的距离是1,
而0到3,4的距离则在1到3,4的距离基础上加1,因为又深了一层,

现在要求的是距离之和,
那么0到3,4的距离之和 = 2(1到3,4的距离之和) + 1* 2(3,4是2个节点,每个节点加深了一层,距离+1)

那么0 (root) 到所有节点的距离之和呢?
就 = 0到它直接连接的1,2的距离之和2 + 1到它直接连接的3,4距离和 + 3,4节点数
= 左子树的距离和(1 (左子树的root) 到它直接连接的3,4的距离和+左子树的节点数(1,3,4共3个))
+ 右子树的距离和(2 (右子树的root) 到它直接连接的null的距离和 + 右子树的节点数(只有2一个))

以此类推,一层一层往下。

能推出这步非常关键,推出这个式子就相当于解决了问题!

所以需要知道以每个节点为root的子树有多少个节点,
是一个从下到上遍历的过程,
所以用后序遍历,把结果保存在nodeNums数组。

遍历完之后,我们能得到节点0到其他所有节点的距离之和。

那其他节点怎么办,以1为例来说明。
之前我们求了以1为root的子树的节点数,是3个(1,3,4),

distance_sum[0] = 0到1 + 0到3 + 0到4 + 0到2
而distance_sum[1] = 1到1 + 1到3 + 1到4 + 1到2
可以看到1,3,4都在以1为root的子树中,这3个节点到1的距离比到0的距离少了1,
而这个子树之外的节点0和2,到1的距离比到0的距离多了1,

那么distance_sum[1] = distance_sum[0] - nodeNums[1]*1 + (n - nodeNums[1]) * 1,
这样一层一层往下走,就能得到所有节点的distance_sum[i],
这是一个从上到下遍历的过程,所以用到树的前序遍历。

无向图的遍历中需要有flag记录节点是不是已经被访问过,
而现在是树,不会有环的出现,但是因为边是双向的,只需要看当前节点是不是又回到上一节点即可。

class Solution {
    ArrayList<Integer>[] graph;
    int[] dis;
    int[] nodeNums;

    public int[] sumOfDistancesInTree(int n, int[][] edges) {
        dis = new int[n];
        nodeNums = new int[n];
        graph = new ArrayList[n];

        for(int i = 0; i < n; i++) graph[i] = new ArrayList<Integer>();

        //make the graph
        for(int[] edge : edges) {
            graph[edge[0]].add(edge[1]);
            graph[edge[1]].add(edge[0]);
        }

        postOrder(0, -1);  //get node numbers
        preOrder(0, -1, n);   //get distance

        return dis;
    }

    //获取以每个node为root的子树的节点数
    void postOrder(int root, int pre) {
        //left & right for binary tree
        //这里不一定是二叉树,可能是多叉树
        for(Integer node : graph[root]) {
            if(node == pre) continue;
            postOrder(node,root);
            nodeNums[root] += nodeNums[node]; 
            dis[root] += dis[node] + nodeNums[node];
        }
        nodeNums[root] ++; //节点数加上root自己
    }

    void preOrder(int root, int pre, int n) {
        for(Integer node : graph[root]) {
            if(node == pre) continue;
            //dis[root]现在是正确的,而和root连接的点到root的距离要-1,
            //以node为root的子树中的所有节点都需要距离-1,
            //所以dis[node] = dis[root]-1*nodeNums[node]
            //但同时,以node为root的子树之外的其他节点到node的距离要+1
            //这个过程是自上而下的
            dis[node] = dis[root] - nodeNums[node] + n - nodeNums[node];
            preOrder(node, root, n);
        }
    }
}
嵌入式开发板OpenClaw部署:ESP32-S3与RISC-V平台性能评估 ESP32-S3与RISC-V平台在OpenClaw部署中的性能评估 本文对比分析了ESP32-S3和RISC-V两种嵌入式平台在OpenClaw部署中的性能表现。ESP32-S3凭借240MHz双核Xtensa LX7处理器和专用AI加速器,特别适合轻量级AI推理任务;而RISC-V凭借开源架构和模块化设计,可实现更高的能效比。文章详细介绍了ESP32-S3-DevKitC-1、SiFive HiFive1等典型开发板的硬件规格,推荐了ESP-IDF和FreeRTOS等操作系统,并提供了完整的开发环 阅读详情

相关推荐

土壤水动力学_前 言

Van Genuchten (V-G) 模型是土壤水分特征曲线中最常用的模型之一。它通过数学方程描述了土壤基质吸力与体积含水量之间的关系,被广泛应用于土壤水分运移、土壤盐渍化、边坡稳定性等研究领域。V-G模型是描述土壤水分特征曲线的重要工具,但它并不是完美的。在实际应用中,需要根据土壤类型、试验条件等因素选择合适的模型。土壤基质吸力是土壤水分学中的一个重要概念,它对土壤水分的保持、植物的生长以及土壤的工程性质都有重要影响。

weixin_44259522的博客 5324

834. 树中距离之和

834. 树中距离之和       解法一:超时的暴力解法 #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;algorithm&gt; #include &lt;map&gt; using namespace std; class Solution { pu...

kongqingxin12的博客 526

动态库加载失败终极指南:从libbz2.so.1错误看Linux依赖管理本质

本文以经典的libbz2.so.1加载错误为例,深入剖析Linux动态链接库管理的核心机制。文章不仅提供从ldd检查、符号链接创建到LD_LIBRARY_PATH设置等实战解决方案,更系统性地讲解了动态链接器的寻库路径、版本管理及依赖问题预防策略,帮助开发者从根本上理解和掌握Linux依赖管理本质。

weixin_29212429的博客 446

每天一道leetcode:834.树中距离之和

今日份题目:834.树中距离之和 (困难)

qq_63349644的博客 256

【无机纳米材料科研制图——OriginLab 0205】Origin对BET吸附/脱附曲线及孔径分布制图...

此篇,我们来分享如何对BET数据进行处理和制图。 一、等温吸脱附曲线绘制 1)找到等温吸脱附文件。 一半来说,对一个样品测一次BET,会产生很多数据,具体因仪器而异。我这里的数据主要有两个文件夹,一个脱附,一个吸附,吸附文件夹中多了一个等温吸脱附的文件夹。而这...

XD_Yangf的博客 803

python——模拟砍价

类型:随机数。

m0_62488776的博客 1970

leetcode 834.树中距离之和

【代码】leetcode 834.树中距离之和。

weixin_44603630的博客 266

别再死记硬背参数了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件)

本文详细解析了4GHz镜像抑制混频器的ADS仿真全流程,从理论到实践,涵盖混频器设计基础、ADS工程搭建、二极管选型、非线性仿真及性能优化。通过实战案例,帮助工程师掌握关键参数平衡与调试技巧,提升射频电路设计效率。

weixin_42552716的博客 337

Leetcode834. 树中距离之和

Leetcode834. 树中距离之和

ProgramNovice的博客 675

STM32嵌入式标准化封装五层架构设计与工程实践

在嵌入式系统开发中,代码封装是保障可维护性、可复用性与可靠性的核心工程能力。其本质是通过分层抽象(硬件抽象层→设备驱动层→应用逻辑层)解耦硬件依赖与业务逻辑,实现跨芯片移植、多任务安全及确定性实时响应。关键技术包括HAL库重构以消除硬编码初始化、驱动层提供同步/异步/事件驱动三类UART接口、中断优先级矩阵管理确保响应确定性、双阶段时钟配置兼顾启动鲁棒性与运行能效,以及面向Modbus等工业协议的语义化API封装。这些实践直击STM32项目中引脚变更难、HAL裸调风险高、中断处理不安全、时钟配置僵化等典型痛

weixin_35019679的博客 66

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 911

Leetcode每日一题(困难):834. 树中距离之和(2023.7.16 C++)

就例 1 来说,我们还是算节结 2 的时候(这时候是第二次遍历,自顶向下),我们用已经算出结果的distSum[0] - nodeNum[2],结点 0 到各个结点的距离总和 减去 以结点2为根节点的子树结点个数,这样减去得到的数字含义为:结点 0 到 结点1 的距离(普遍来说是到其他子树的结点距离总和) 加上 结点 2 到以结点 2 为根的子树的结点距离总和。首先,我们要算出每个以 i 为根结点的子树的结点数量 nodeNum[i] 和 i 到子树其他结点的距离总和distSum[i]。

Cosmoshhhyyy的博客 580

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 148

leetcode 834. Sum of Distances in Tree | 834. 树中距离之和(树形DP)

题目 https://leetcode.com/problems/sum-of-distances-in-tree/ 题解 一般的算法题,指令条数为 10^8 以内是可以通过的。也就是说,如果 arr.length=10^6 的话,你的算法不能超过 O(n^2)。 根据本题数据范围限制,1 <= n <= 3 * 10^4,所以常规的 Dijskra 和 Floid 在复杂度上明显会超时。没继续在暴力法上耗时间,直奔答案了。 Should I quit ? No, I will ignore

寒泉 4万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[Swift]LeetCode834. 树中距离之和 | Sum of Distances in Tree

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://www.cnblogs.com/stren...

weixin_30604651的博客 240

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[LeetCode] 834. Sum of Distances in Tree 树中距离之和

An undirected, connectedtree withNnodes labelled0...N-1andN-1edgesaregiven. Theith edge connects nodesedges[i][0]andedges[i][1]together. Return a listans, whereans[i]is the sum ...

weixin_30699235的博客 266

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode 834. 树中距离之和

原题目:https://leetcode-cn.com/problems/sum-of-distances-in-tree/ 思路: 采用树形动态规划的思想。对于每一个节点来说,所有节点到他的距离之和的状态转移方程为: 其中dp[v]代表以v为根的所有节点到他的距离,sz[v]表示已v为根的子树节点的数量。 当一次遍历完,得到了所有节点的dp时,我们不需要以另一个节点为根重新遍历,只需要对树结构进行变化(官方解答的视频),所以每一次做变化我们只需要变换dp[u],sz[u],dp[v],s.

庾信平生最萧瑟 297

[LeetCode] 834. Sum of Distances in Tree

LeetCode刷题记录 传送门 Description An undirected, connectedtreewith Nnodes labelled0...N-1andN-1edgesaregiven. The ith edge connects nodesedges[i][0]andedges[i][1]together. Return a list ...

weixin_30293135的博客 153

LeetCode //C - 834. Sum of Distances in Tree

Article Summary The task requires computing the sum of the distances from each node to all other nodes in a tree. Given an undirected, connected tree with n nodes and n-1 edges, this problem is efficiently solved using two depth-first searches (DFS). First

Made in Code 1148

【Leetcode】834. Sum of Distances in Tree

题目地址: https://leetcode.com/problems/sum-of-distances-in-tree/ 给定一棵nnn个顶点的无向树,每个顶点编号0∼n−10\sim n-10∼n−1。求一个数组ddd,使得d[i]d[i]d[i]是顶点iii到其余每个顶点的距离之总和。边长视为111。 思路参考https://blog.csdn.net/qq_46105170/article/details/118584042。大致意思是,先选定000作为树根,然后求这样两个数,一个是数组ccc,c[

数学、算法爱好者的博客 655

834. Sum of Distances in Tree(leetcode, hard)

https://leetcode.com/problems/sum-of-distances-in-tree/ 例如:无向图如下 (参考: https://leetcode.com/problems/sum-of-distances-in-tree/discuss/130567/Two-traversals-O(N)-python-solution-with-Explanation) 灰色 gr...

master-dragon的专栏 529

LeetCode 834 Sum of Distances in Tree

传送门 题意: 给定一棵树, 输出每个点到其他点的距离之和. 思路: 首先我们先dfs一遍, 存下每个点的子节点数(包括自己), 和一个值称dp, dp[u] 表示u的所有子节点到u的距离之和, 那么很容易也可以在第一次dfs中维护, 那么此时dp[0] (假设0是根节点), 就是0的答案, 那么其他的答案了, 实际上可以通过父亲的ans来转移, 此时ans[0] = dp[0], 那么假设0的字...

Anxdada -- 我等风来也等你 512

LeetCode 834. Sum of Distances in Tree

题目链接:https://leetcode.com/problems/sum-of-distances-in-tree/ 题意:给出一棵树,对于每个节点,求出其他所有节点与该节点的距离之和。节点数不超过10000。 思路:如图所示,暴力复杂度太高,考虑进行优化,如图所示,考虑一对父子节点u与v,son[u]表示以u为根节点的子树的节点个数。若已知父节点u到其他所有节点的距离和,则可推...

weixin_30478923的博客 146

834. Sum of Distances in Tree c++

An undirected, connectedtree withNnodes labelled0...N-1andN-1edgesaregiven. Theith edge connects nodesedges[i][0]andedges[i][1]together. Return a listans, whereans[i]is the sum of th...

cmy203的博客 281

[leetcode]834. Sum of Distances in Tree

链接:https://leetcode.com/problems/sum-of-distances-in-tree/description/An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges are given.The ith edge connects nodes edges[i][0] and ed...

xiaocong1990的博客 1121

834. Sum of Distances in Tree(Leetcode每日一题-2020.10.06)--抄答案

Problem An undirected, connected tree with N nodes labelled 0…N-1 and N-1 edges are given. The ith edge connects nodes edges[i][0] and edges[i][1] together. Return a list ans, where ans[i] is the sum of the distances between node i and all other nodes. Not

Bryan要加油 698
上一篇: NanoDet 源码解读(inference)
下一篇: ubuntu ffmpeg 截取视频指定时间范围,坐标范围
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值