Weighted Sum of a Tree solution and explanation
6 more videos on this problem
LeetCode 4015 | Weekly Contest 514 Q2 | Weighted Sum of a Tree | Medium | BFS 🙌CodeSprint · 10:00 · 173 views
LeetCode 4015 — Weighted Sum of a Tree | BFS Explained | JavaRitesh · 16:29 · 110 views
4015. Weighted Sum of a Tree (Leetcode Medium)Programming Live with Larry · 7:26 · 89 views
LeetCode 4015 | Weighted Sum of a Tree | Weekly Contest 514 Q2 🔥 BFS Solution Explained | C++Logic Mode · 18:38 · 57 views
LeetCode Weekly Contest 514 | 4014 & 4015 Explained in JavaProof2Code · 14:35 · 35 views
leetcode 4015 Weighted Sum of a Tree | traversal along a chainCode-Yao · 8:36 · 16 views
LeetCode 4015 – Weighted Sum of a Tree | BFS Solution | C++DEV.I · 3:54 · 4 views
The problem
You are given an integer array parent of length n representing a rooted tree with nodes labeled from 0 to n - 1.
The tree is rooted at node 0, so parent[0] = -1. For each node i where 1 <= i <= n - 1, parent[i] denotes the parent of node i.
You are also given an integer array nums of length n, where nums[i] denotes the value of node i.
The weight of a node i at depth d is nums[i] * (h - d + 1), where h is the height of the tree.
Return the sum of the weights of all nodes in the tree.
The depth of a node is the number of nodes on the path from the root to that node, inclusive, with the root having depth 1.
The height of the tree is the maximum depth among all nodes in the tree.
Example 1:
​​​​​​​
Input: parent = [-1,0,0,0,2,2], nums = [5,2,3,1,4,6]
Output: 37
Explanation:
The height of the tree is 3.
| Node | nums[i] |
Depth (d) |
Weight |
|---|---|---|---|
| 0 | 5 | 1 | 5 * (3 - 1 + 1) = 15 |
| 1 | 2 | 2 | 2 * (3 - 2 + 1) = 4 |
| 2 | 3 | 2 | 3 * (3 - 2 + 1) = 6 |
| 3 | 1 | 2 | 1 * (3 - 2 + 1) = 2 |
| 4 | 4 | 3 | 4 * (3 - 3 + 1) = 4 |
| 5 | 6 | 3 | 6 * (3 - 3 + 1) = 6 |
The sum of all node weights is 15 + 4 + 6 + 2 + 4 + 6 = 37.
Example 2:
​​​​​​​​​​​​​​
Input: parent = [-1,0,1,2], nums = [1,2,3,4]
Output: 20
Explanation:
The height of the tree is 4.
| Node | nums[i] |
Depth (d) |
Weight |
|---|---|---|---|
| 0 | 1 | 1 | 1 * (4 - 1 + 1) = 4 |
| 1 | 2 | 2 | 2 * (4 - 2 + 1) = 6 |
| 2 | 3 | 3 | 3 * (4 - 3 + 1) = 6 |
| 3 | 4 | 4 | 4 * (4 - 4 + 1) = 4 |
The sum of all node weights is 4 + 6 + 6 + 4 = 20.
Constraints:
1 <= n <= 105n == parent.length == nums.lengthparent[0] == -10 <= parent[i] <= n - 1for alliin[1, n - 1]1 <= nums[i] <= 106- The input is generated such that the array
parentrepresents a valid tree rooted at node 0.
Approach overview
Problem Overview: Given a tree where each edge has an associated weight, compute the total weighted sum of all paths from the root to every node. This is a fundamental tree traversal problem that tests your ability to accumulate values during traversal.
Approach 1: Recursive DFS (O(n) time, O(h) space)
Depth-first search is the most intuitive way to solve this. Start at the root with a cumulative sum of 0. For each child, add the edge weight to the current sum and recurse. When you reach a leaf, add the accumulated sum to the total. This works because you're carrying the path sum down the recursion stack. The time complexity is O(n) since you visit every node once, but the space complexity depends on the tree height h, which can be O(n) for skewed trees and risks stack overflow.
Approach 2: Iterative BFS (O(n) time, O(w) space)
Breadth-First Search processes nodes level by level using a queue. Initialize a queue with the root and its cumulative weight (0). While the queue isn't empty, pop a node, add its cumulative weight to the total, and push each child with the updated cumulative weight (parent's weight + edge weight). This avoids recursion entirely and is more robust for deep trees. The key insight is that each node's cumulative weight depends only on its parent's value, so you can compute it on the fly during traversal. Time is O(n), space is O(w) where w is the maximum width of the tree—typically much smaller than n.
Recommended for interviews: Interviewers expect you to implement the BFS approach because it demonstrates iterative thinking and avoids recursion depth issues. While DFS shows you understand recursion, BFS is often preferred in production code for tree traversal problems due to its predictable memory usage. Start with DFS to show you can reason about recursion, then optimize to BFS for a stronger solution.
Solution
The weight of node i is nums[i] times (h - d_i + 1), where d_i is the depth of node i and h is the height of the tree. Therefore, the sum of the weights of all nodes is:
$sum_{i=0}^{n-1} nums[i] times (h - d_i + 1) = h times sum_{i=0}^{n-1} nums[i] + sum_{i=0}^{n-1} nums[i] times (1 - d_i)
We can use BFS to traverse the tree level by level. During the traversal, we maintain the current level d (the root is at level 1) and accumulate nums[i] times (1 - d) for each node. After the traversal finishes, d equals the height h of the tree, and adding h times sum nums[i] gives the answer.
The time complexity is O(n), and the space complexity is O(n), where n$ is the number of nodes.
class Solution:
def weightedSum(self, parent: list[int], nums: list[int]) -> int:
n = len(nums)
g = [[] for _ in range(n)]
for i in range(1, n):
g[parent[i]].append(i)
ans = 0
q = [0]
d = 0
while q:
d += 1
nq = []
for i in q:
ans += nums[i] * (1 - d)
nq.extend(g[i])
q = nq
ans += d * sum(nums)
return ansclass Solution {
public long weightedSum(int[] parent, int[] nums) {
int n = nums.length;
List<Integer>[] g = new ArrayList[n];
Arrays.setAll(g, e -> new ArrayList<>());
for (int i = 1; i < n; i++) {
g[parent[i]].add(i);
}
long ans = 0;
List<Integer> q = new ArrayList<>();
q.add(0);
int d = 0;
while (!q.isEmpty()) {
d++;
List<Integer> nq = new ArrayList<>();
for (int i : q) {
ans += (long) nums[i] * (1 - d);
nq.addAll(g[i]);
}
q = nq;
}
long sum = 0;
for (int x : nums) {
sum += x;
}
ans += (long) d * sum;
return ans;
}
}class Solution {
public:
long long weightedSum(vector<int>& parent, vector<int>& nums) {
int n = nums.size();
vector<vector<int>> g(n);
for (int i = 1; i < n; i++) {
g[parent[i]].push_back(i);
}
long long ans = 0;
vector<int> q = {0};
int d = 0;
while (!q.empty()) {
d++;
vector<int> nq;
for (int i : q) {
ans += 1LL * nums[i] * (1 - d);
for (int son : g[i]) {
nq.push_back(son);
}
}
q = move(nq);
}
long long sum = 0;
for (int x : nums) {
sum += x;
}
ans += 1LL * d * sum;
return ans;
}
};function weightedSum(parent: number[], nums: number[]): number {
const n = nums.length;
const g: number[][] = Array.from({ length: n }, () => []);
for (let i = 1; i < n; i++) {
g[parent[i]].push(i);
}
let ans = 0;
let q: number[] = [0];
let d = 0;
while (q.length > 0) {
d++;
const nq: number[] = [];
for (const i of q) {
ans += nums[i] * (1 - d);
for (const son of g[i]) {
nq.push(son);
}
}
q = nq;
}
let sum = 0;
for (const x of nums) {
sum += x;
}
ans += d * sum;
return ans;
}func weightedSum(parent []int, nums []int) int64 {
n := len(nums)
g := make([][]int, n)
for i := 1; i < n; i++ {
g[parent[i]] = append(g[parent[i]], i)
}
var ans int64
q := []int{0}
d := 0
for len(q) > 0 {
d++
nq := make([]int, 0)
for _, i := range q {
ans += int64(nums[i]) * int64(1-d)
for _, son := range g[i] {
nq = append(nq, son)
}
}
q = nq
}
var sum int64
for _, x := range nums {
sum += int64(x)
}
ans += int64(d) * sum
return ans
}Complexity analysis
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Recursive DFS | O(n) | O(h) | When tree is balanced and recursion depth is safe |
| Iterative BFS | O(n) | O(w) | General case; avoids recursion; handles deep trees |
Frequently asked questions
Is Weighted Sum of a Tree easy or hard?
It's rated Medium on FleetCode with a 41.7% acceptance rate. It's not trivial because you need to handle edge weights correctly, but it's manageable if you're comfortable with standard tree traversals.
Weighted Sum of a Tree Python/Java solution
You can implement BFS in Python using collections.deque and in Java using LinkedList or ArrayDeque. The logic remains identical across languages: push root with weight 0, pop nodes, accumulate weights, push children with updated weights.
How to solve Weighted Sum of a Tree in O(n)?
Use BFS or DFS traversal. Maintain a cumulative weight for each node as parent weight plus edge weight. Add these cumulative weights as you visit each node. Both approaches run in O(n) time.
What is the best approach for Weighted Sum of a Tree?
The best approach is iterative Breadth-First Search (BFS). It runs in O(n) time and uses O(w) space, where w is the maximum width of the tree. BFS avoids recursion depth issues and is straightforward to implement with a queue.
Is Weighted Sum of a Tree asked at Google/Amazon/Meta?
Yes, tree traversal problems like this are common at top tech companies including Google, Amazon, and Meta. They test your understanding of graph traversal and handling weighted edges.
What data structure is used in Weighted Sum of a Tree?
A queue is used for iterative BFS traversal. Alternatively, recursion uses an implicit stack for DFS. The tree itself is typically represented using adjacency lists or node objects with children.
What is the time complexity of Weighted Sum of a Tree?
The optimal time complexity is O(n), where n is the number of nodes in the tree. You must visit every node exactly once to compute the cumulative weighted sum.
