news 2026/7/16 8:49:56

DeepSeek LeetCode 3585. 树中找到带权中位节点 Python3实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 3585. 树中找到带权中位节点 Python3实现

解题思路

核心思想:利用树上倍增(LCA)+ 二分跳跃在 O(log n) 时间内回答每个查询。

1. 预处理:
· 以节点 0 为根,DFS 计算每个节点的深度 depth[]、到根的距离 dist[](边权和),以及倍增祖先表 parent[k][u](表示 u 的 2^k 级祖先)。
· 树中边权为正,因此路径距离单调递增。
2. 查询处理((u, v)):
· 若 u == v,答案就是 u。
· 求 u 和 v 的 LCA l,计算路径总权值 total = dist[u] + dist[v] - 2*dist[l],取半阈值 half = (total + 1) // 2(向上取整)。
· 情况一:中位节点在 u → l 这一段(即 dist[u] - dist[l] >= half)。从 u 向上跳,找到最后一个满足 dist[u] - dist[ancestor] < half 的祖先,答案就是该祖先的父节点。
· 情况二:中位节点在 l → v 这一段。先计算 need = half - (dist[u] - dist[l]),表示从 l 向下还需走的权值。从 v 向上跳,找到最浅(最靠近 l)的满足 dist[ancestor] - dist[l] >= need 的祖先,该祖先即为答案。

---

Python3 实现

```python
from typing import List

class Solution:
def findMedian(self, n: int, edges: List[List[int]], queries: List[List[int]]) -> List[int]:
# 建图(邻接表)
adj = [[] for _ in range(n)]
for u, v, w in edges:
adj[u].append((v, w))
adj[v].append((u, w))

LOG = (n).bit_length() + 1 # 倍增表大小
parent = [[-1] * n for _ in range(LOG)]
depth = [0] * n
dist = [0] * n

# 迭代 DFS 预处理(避免递归深度问题)
stack = [(0, -1, 0, 0)] # (node, parent, depth, distance)
while stack:
u, p, d, w = stack.pop()
parent[0][u] = p
depth[u] = d
dist[u] = w
for v, wt in adj[u]:
if v == p:
continue
stack.append((v, u, d + 1, w + wt))

# 构建倍增表
for k in range(1, LOG):
prev = parent[k - 1]
curr = parent[k]
for i in range(n):
anc = prev[i]
curr[i] = prev[anc] if anc != -1 else -1

# ---------- 辅助函数 ----------
def kth_ancestor(u: int, k: int) -> int:
"""返回 u 的第 k 级祖先(k >= 0),若不存在返回 -1"""
i = 0
while k:
if k & 1:
u = parent[i][u]
if u == -1:
break
k >>= 1
i += 1
return u

def lca(u: int, v: int) -> int:
"""返回 u 和 v 的最近公共祖先"""
if depth[u] < depth[v]:
u, v = v, u
# 提升 u 至与 v 同深度
u = kth_ancestor(u, depth[u] - depth[v])
if u == v:
return u
# 一起向上跳
for k in range(LOG - 1, -1, -1):
if parent[k][u] != parent[k][v]:
u = parent[k][u]
v = parent[k][v]
return parent[0][u]

def weighted_median(u: int, v: int) -> int:
if u == v:
return u
l = lca(u, v)
total = dist[u] + dist[v] - 2 * dist[l]
half = (total + 1) // 2 # 向上取整

# 情况 1:中位节点在 u -> l 段
if dist[u] - dist[l] >= half:
cur = u
for k in range(LOG - 1, -1, -1):
nxt = parent[k][cur]
if nxt != -1 and dist[u] - dist[nxt] < half:
cur = nxt
return parent[0][cur]
# 情况 2:中位节点在 l -> v 段
else:
need = half - (dist[u] - dist[l])
cur = v
for k in range(LOG - 1, -1, -1):
nxt = parent[k][cur]
if (nxt != -1 and depth[nxt] >= depth[l] and
dist[nxt] - dist[l] >= need):
cur = nxt
return cur

# 处理所有查询
return [weighted_median(u, v) for u, v in queries]
```

---

复杂度分析

· 时间复杂度:预处理 O(n log n),每个查询 O(log n),总复杂度 O((n + q) log n)。
· 空间复杂度:邻接表 O(n),倍增表 O(n log n),总复杂度 O(n log n)。

注意:边权和路径总权值可能超过 32 位整数范围,Python 的 int 无此限制,无需额外处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 8:47:57

muduo网络库(三):日志输出

muduo网络库&#xff08;三&#xff09;&#xff1a;日志输出muduo网络库&#xff08;三&#xff09;&#xff1a;日志输出总体介绍单例模式的实现为什么不直接构造而用单例利用宏函数输出日志信息时间戳的设计精髓muduo网络库&#xff08;三&#xff09;&#xff1a;日志输出 …

作者头像 李华
网站建设 2026/7/16 8:45:07

锐捷交换机Trunk端口VLAN过滤策略实战:四种allowed vlan模式详解与应用

1. 锐捷交换机Trunk端口基础概念 Trunk端口是交换机上用于跨设备传输多VLAN数据的关键配置。想象一下Trunk就像高速公路上的多车道&#xff0c;每个车道&#xff08;VLAN&#xff09;可以独立传输数据而不会互相干扰。在锐捷交换机中&#xff0c;当我们需要让不同交换机上的相同…

作者头像 李华
网站建设 2026/7/16 8:43:38

Deepseek V4:打破AI代码助手枷锁,提升工程开发效率

上周在调试一个复杂的多模块项目时&#xff0c;我遇到了一个让人头疼的问题&#xff1a;代码逻辑看似正确&#xff0c;但运行时总在某些边界条件下出现难以追踪的异常。尝试了几个主流的大模型助手后&#xff0c;要么是上下文长度不够&#xff0c;要么是对代码逻辑的理解停留在…

作者头像 李华
网站建设 2026/7/16 8:42:09

3分钟解锁AO3镜像站:绕过访问限制的终极免费方案

3分钟解锁AO3镜像站&#xff1a;绕过访问限制的终极免费方案 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 你是否曾经在深夜打开浏览器&#xff0c;满怀期待地想要阅读心爱的同人作品&#xff0c;却只看到冰冷的&qu…

作者头像 李华
网站建设 2026/7/16 8:41:52

医疗远程会诊系统建设方案:助力多院区协同与专家资源共享

核心摘要医疗远程会诊系统的核心价值&#xff0c;是把三甲医院、区域医疗中心、基层医院连接成统一协作网络&#xff0c;实现远程专家会诊、影像诊断、教学培训、远程查房等业务闭环。对多院区医院而言&#xff0c;建设重点不只是“开视频会议”&#xff0c;而是要打通会诊流程…

作者头像 李华
网站建设 2026/7/16 8:37:56

深耕包装设计领域:东莞视维品牌以视觉赋能产品价值

在东莞的品牌设计领域&#xff0c;广东视维品牌营销咨询有限公司&#xff08;SIVIBRAND&#xff09;是一家专注品牌策略与视觉落地的专业机构。自成立以来&#xff0c;视维持续为制造、快消、大健康等多个行业的企业提供品牌全案服务&#xff0c;其中包装设计作为连接品牌与消费…

作者头像 李华