2641. Cousins in Binary Tree II
Description
Given the root
of a binary tree, replace the value of each node in the tree with the sum of all its cousins' values.
Two nodes of a binary tree are cousins if they have the same depth with different parents.
Return the root
of the modified tree.
Note that the depth of a node is the number of edges in the path from the root node to it.
Example 1:
Input: root = [5,4,9,1,10,null,7] Output: [0,0,0,7,7,null,11] Explanation: The diagram above shows the initial binary tree and the binary tree after changing the value of each node. - Node with value 5 does not have any cousins so its sum is 0. - Node with value 4 does not have any cousins so its sum is 0. - Node with value 9 does not have any cousins so its sum is 0. - Node with value 1 has a cousin with value 7 so its sum is 7. - Node with value 10 has a cousin with value 7 so its sum is 7. - Node with value 7 has cousins with values 1 and 10 so its sum is 11.
Example 2:
Input: root = [3,1,2] Output: [0,0,0] Explanation: The diagram above shows the initial binary tree and the binary tree after changing the value of each node. - Node with value 3 does not have any cousins so its sum is 0. - Node with value 1 does not have any cousins so its sum is 0. - Node with value 2 does not have any cousins so its sum is 0.
Constraints:
- The number of nodes in the tree is in the range
[1, 105]
. 1 <= Node.val <= 104
Solutions
Solution: Breadth-First Search
- Time complexity: O(n)
- Space complexity: O(n)
JavaScript
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
const replaceValueInTree = function (root) {
let queue = [{ node: root, parent: new TreeNode() }];
let depthSum = 0;
while (queue.length) {
const nextQueue = [];
let nextDepthSum = 0;
for (const { node, parent } of queue) {
const childSum = (node.left?.val ?? 0) + (node.right?.val ?? 0);
node.val = depthSum - (parent.childSum ?? 0);
node.childSum = childSum;
nextDepthSum += childSum;
if (node.left) nextQueue.push({ node: node.left, parent: node });
if (node.right) nextQueue.push({ node: node.right, parent: node });
}
depthSum = nextDepthSum;
queue = nextQueue;
}
return root;
};