diff --git a/java/cousins-in-binary-tree-ii.java b/java/cousins-in-binary-tree-ii.java new file mode 100644 index 0000000..706e47c --- /dev/null +++ b/java/cousins-in-binary-tree-ii.java @@ -0,0 +1,51 @@ +class Solution { + private int get(TreeNode node) { + if (node == null) { + return 0; + } + return node.val; + } + + private void handleNode(Queue q, int siblings, TreeNode node) { + if (node == null) { + return; + } + + node.val = siblings; + q.offer(node); + } + + private int handleLevel(Queue q, int previous) { + int sum = 0; + + for (int i = q.size(); i > 0; --i) { + var node = q.poll(); + node.val = previous - node.val; + + var siblings = get(node.left) + get(node.right); + handleNode(q, siblings, node.left); + handleNode(q, siblings, node.right); + + sum += siblings; + } + + return sum; + } + + public TreeNode replaceValueInTree(TreeNode root) { + if (root == null) { + return root; + } + + Queue q = new ArrayDeque<>(); + + int sumAbove = root.val; + q.offer(root); + + while (!q.isEmpty()) { + sumAbove = handleLevel(q, sumAbove); + } + + return root; + } +}