From 1edfc568115ad6da7ba41093a66dc9b49d4a0e23 Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 21:46:21 +0530 Subject: [PATCH 01/14] Create diameterOfBinaryTree.js --- Trees/diameterOfBinaryTree.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Trees/diameterOfBinaryTree.js diff --git a/Trees/diameterOfBinaryTree.js b/Trees/diameterOfBinaryTree.js new file mode 100644 index 0000000000..482029406b --- /dev/null +++ b/Trees/diameterOfBinaryTree.js @@ -0,0 +1,30 @@ +/** + * Calculates the diameter of a binary tree. + * The diameter is the length of the longest path between any two nodes. + * @param {TreeNode} root The root node of the tree. + * @returns {number} The diameter of the tree. + */ +export function diameterOfBinaryTree(root) { + let diameter = 0; + + // This helper function returns the height of a subtree, + // but it calculates and updates the diameter as a side effect. + function height(node) { + if (node === null) { + return 0; + } + + const leftHeight = height(node.left); + const rightHeight = height(node.right); + + // The diameter at this node is the sum of the heights of its subtrees. + // We update the global maximum diameter if this path is longer. + diameter = Math.max(diameter, leftHeight + rightHeight); + + // The height of the tree at this node is 1 + the max height of its subtrees. + return 1 + Math.max(leftHeight, rightHeight); + } + + height(root); + return diameter; +} From 6b99a520a9cfd49bc41d76b951631b25094f5f1f Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 21:46:54 +0530 Subject: [PATCH 02/14] Create diameterOfBinaryTree.test.js --- Trees/test/diameterOfBinaryTree.test.js | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Trees/test/diameterOfBinaryTree.test.js diff --git a/Trees/test/diameterOfBinaryTree.test.js b/Trees/test/diameterOfBinaryTree.test.js new file mode 100644 index 0000000000..bc9830aa24 --- /dev/null +++ b/Trees/test/diameterOfBinaryTree.test.js @@ -0,0 +1,47 @@ +import { diameterOfBinaryTree } from './diameterOfBinaryTree'; +import { TreeNode } from '../utils/TreeNode'; + +describe('Diameter of a Binary Tree', () => { + it('should calculate the correct diameter for a standard tree', () => { + // 1 + // / \ + // 2 3 + // / \ + // 4 5 + // Longest path is 4 -> 2 -> 1 -> 3 (length 3) or 5 -> 2 -> 1 -> 3 (length 3) + const root = new TreeNode(1); + root.left = new TreeNode(2); + root.right = new TreeNode(3); + root.left.left = new TreeNode(4); + root.left.right = new TreeNode(5); + expect(diameterOfBinaryTree(root)).toBe(3); + }); + + it('should work for a skewed tree where diameter does not pass through root', () => { + // 1 + // / + // 2 + // / \ + // 3 4 + // / \ + // 5 6 + // / \ + // 7 8 + // Longest path is 7 -> 5 -> 4 -> 6 -> 8 (length 4) + const root = new TreeNode(1); + root.left = new TreeNode(2); + root.left.left = new TreeNode(3); + root.left.right = new TreeNode(4); + root.left.right.left = new TreeNode(5); + root.left.right.right = new TreeNode(6); + root.left.right.left.left = new TreeNode(7); + root.left.right.right.right = new TreeNode(8); + expect(diameterOfBinaryTree(root)).toBe(6); + }); + + it('should return 0 for a null or single-node tree', () => { + expect(diameterOfBinaryTree(null)).toBe(0); + const singleNode = new TreeNode(1); + expect(diameterOfBinaryTree(singleNode)).toBe(0); + }); +}); From c723b704e939513bc442f9bfffed571b85f57c8e Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 21:48:54 +0530 Subject: [PATCH 03/14] Rename diameterOfBinaryTree.test.js to DiameterOfBinaryTree.test.js --- ...{diameterOfBinaryTree.test.js => DiameterOfBinaryTree.test.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Trees/test/{diameterOfBinaryTree.test.js => DiameterOfBinaryTree.test.js} (100%) diff --git a/Trees/test/diameterOfBinaryTree.test.js b/Trees/test/DiameterOfBinaryTree.test.js similarity index 100% rename from Trees/test/diameterOfBinaryTree.test.js rename to Trees/test/DiameterOfBinaryTree.test.js From 5c22a2ca17cba02961c77a8a377e88b4655be82e Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 21:49:07 +0530 Subject: [PATCH 04/14] Rename diameterOfBinaryTree.js to DiameterOfBinaryTree.js --- Trees/{diameterOfBinaryTree.js => DiameterOfBinaryTree.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Trees/{diameterOfBinaryTree.js => DiameterOfBinaryTree.js} (100%) diff --git a/Trees/diameterOfBinaryTree.js b/Trees/DiameterOfBinaryTree.js similarity index 100% rename from Trees/diameterOfBinaryTree.js rename to Trees/DiameterOfBinaryTree.js From a9948f47b27ac5ded0ca41211e2b6ddbe0ecc41a Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 22:48:53 +0530 Subject: [PATCH 05/14] Update DiameterOfBinaryTree.js --- Trees/DiameterOfBinaryTree.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Trees/DiameterOfBinaryTree.js b/Trees/DiameterOfBinaryTree.js index 482029406b..d9083a7551 100644 --- a/Trees/DiameterOfBinaryTree.js +++ b/Trees/DiameterOfBinaryTree.js @@ -1,14 +1,14 @@ /** * Calculates the diameter of a binary tree. * The diameter is the length of the longest path between any two nodes. + * This path does not necessarily need to pass through the root. * @param {TreeNode} root The root node of the tree. * @returns {number} The diameter of the tree. + * @see {@link https://en.wikipedia.org/wiki/Tree_(graph_theory)#Properties} */ export function diameterOfBinaryTree(root) { let diameter = 0; - // This helper function returns the height of a subtree, - // but it calculates and updates the diameter as a side effect. function height(node) { if (node === null) { return 0; @@ -17,11 +17,8 @@ export function diameterOfBinaryTree(root) { const leftHeight = height(node.left); const rightHeight = height(node.right); - // The diameter at this node is the sum of the heights of its subtrees. - // We update the global maximum diameter if this path is longer. diameter = Math.max(diameter, leftHeight + rightHeight); - // The height of the tree at this node is 1 + the max height of its subtrees. return 1 + Math.max(leftHeight, rightHeight); } From fd577ca47abed94ce7fe3efc34e91352152eec55 Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 22:55:11 +0530 Subject: [PATCH 06/14] Update DiameterOfBinaryTree.test.js --- Trees/test/DiameterOfBinaryTree.test.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Trees/test/DiameterOfBinaryTree.test.js b/Trees/test/DiameterOfBinaryTree.test.js index bc9830aa24..4bdf43cf39 100644 --- a/Trees/test/DiameterOfBinaryTree.test.js +++ b/Trees/test/DiameterOfBinaryTree.test.js @@ -1,5 +1,16 @@ -import { diameterOfBinaryTree } from './diameterOfBinaryTree'; -import { TreeNode } from '../utils/TreeNode'; +/** + * A node for a binary tree. + */ +class TreeNode { + constructor(value) { + this.value = value; + this.left = null; + this.right = null; + } +} + +import { diameterOfBinaryTree } from './DiameterOfBinaryTree'; + describe('Diameter of a Binary Tree', () => { it('should calculate the correct diameter for a standard tree', () => { From df5f8f36daa210bad8a0b1cdfedce6fcebf028ff Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:00:04 +0530 Subject: [PATCH 07/14] Update DiameterOfBinaryTree.test.js --- Trees/test/DiameterOfBinaryTree.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trees/test/DiameterOfBinaryTree.test.js b/Trees/test/DiameterOfBinaryTree.test.js index 4bdf43cf39..d265df6543 100644 --- a/Trees/test/DiameterOfBinaryTree.test.js +++ b/Trees/test/DiameterOfBinaryTree.test.js @@ -9,7 +9,7 @@ class TreeNode { } } -import { diameterOfBinaryTree } from './DiameterOfBinaryTree'; +import { diameterOfBinaryTree } from '../DiameterOfBinaryTree'; describe('Diameter of a Binary Tree', () => { From d6081d88a221f258425e8678d65ca37e2cb4239c Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:07:16 +0530 Subject: [PATCH 08/14] Update DiameterOfBinaryTree.test.js --- Trees/test/DiameterOfBinaryTree.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trees/test/DiameterOfBinaryTree.test.js b/Trees/test/DiameterOfBinaryTree.test.js index d265df6543..1b78300aa2 100644 --- a/Trees/test/DiameterOfBinaryTree.test.js +++ b/Trees/test/DiameterOfBinaryTree.test.js @@ -47,7 +47,7 @@ describe('Diameter of a Binary Tree', () => { root.left.right.right = new TreeNode(6); root.left.right.left.left = new TreeNode(7); root.left.right.right.right = new TreeNode(8); - expect(diameterOfBinaryTree(root)).toBe(6); + expect(diameterOfBinaryTree(root)).toBe(4); }); it('should return 0 for a null or single-node tree', () => { From bbc00a9a902377002934f5ca15387c9acf7f24f6 Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:10:47 +0530 Subject: [PATCH 09/14] Update DiameterOfBinaryTree.js From 4c8e6aa99d552e2418a148d23de0c8d4a40fc4d1 Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:11:33 +0530 Subject: [PATCH 10/14] Update DiameterOfBinaryTree.test.js --- Trees/test/DiameterOfBinaryTree.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Trees/test/DiameterOfBinaryTree.test.js b/Trees/test/DiameterOfBinaryTree.test.js index 1b78300aa2..1b215e3454 100644 --- a/Trees/test/DiameterOfBinaryTree.test.js +++ b/Trees/test/DiameterOfBinaryTree.test.js @@ -38,7 +38,6 @@ describe('Diameter of a Binary Tree', () => { // 5 6 // / \ // 7 8 - // Longest path is 7 -> 5 -> 4 -> 6 -> 8 (length 4) const root = new TreeNode(1); root.left = new TreeNode(2); root.left.left = new TreeNode(3); @@ -47,12 +46,15 @@ describe('Diameter of a Binary Tree', () => { root.left.right.right = new TreeNode(6); root.left.right.left.left = new TreeNode(7); root.left.right.right.right = new TreeNode(8); + + // CORRECTED: The longest path is 7 -> 5 -> 4 -> 6 -> 8, which has 4 edges. expect(diameterOfBinaryTree(root)).toBe(4); }); it('should return 0 for a null or single-node tree', () => { expect(diameterOfBinaryTree(null)).toBe(0); const singleNode = new TreeNode(1); + // Typo fixed here expect(diameterOfBinaryTree(singleNode)).toBe(0); }); }); From 7d7368f7ff8cde340b5c8e5a174efb5847208270 Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:19:08 +0530 Subject: [PATCH 11/14] Update DiameterOfBinaryTree.js --- Trees/DiameterOfBinaryTree.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Trees/DiameterOfBinaryTree.js b/Trees/DiameterOfBinaryTree.js index d9083a7551..70426e3a0a 100644 --- a/Trees/DiameterOfBinaryTree.js +++ b/Trees/DiameterOfBinaryTree.js @@ -7,21 +7,21 @@ * @see {@link https://en.wikipedia.org/wiki/Tree_(graph_theory)#Properties} */ export function diameterOfBinaryTree(root) { - let diameter = 0; + let diameter = 0 function height(node) { if (node === null) { - return 0; + return 0 } - const leftHeight = height(node.left); - const rightHeight = height(node.right); + const leftHeight = height(node.left) + const rightHeight = height(node.right) - diameter = Math.max(diameter, leftHeight + rightHeight); + diameter = Math.max(diameter, leftHeight + rightHeight) - return 1 + Math.max(leftHeight, rightHeight); + return 1 + Math.max(leftHeight, rightHeight) } - height(root); - return diameter; + height(root) + return diameter } From 10b3c7340f3a6d909d7eeb34fc9c0e7523c425a4 Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:19:43 +0530 Subject: [PATCH 12/14] Update DiameterOfBinaryTree.test.js --- Trees/test/DiameterOfBinaryTree.test.js | 45 ++++++++++++------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/Trees/test/DiameterOfBinaryTree.test.js b/Trees/test/DiameterOfBinaryTree.test.js index 1b215e3454..a238fb3291 100644 --- a/Trees/test/DiameterOfBinaryTree.test.js +++ b/Trees/test/DiameterOfBinaryTree.test.js @@ -20,13 +20,13 @@ describe('Diameter of a Binary Tree', () => { // / \ // 4 5 // Longest path is 4 -> 2 -> 1 -> 3 (length 3) or 5 -> 2 -> 1 -> 3 (length 3) - const root = new TreeNode(1); - root.left = new TreeNode(2); - root.right = new TreeNode(3); - root.left.left = new TreeNode(4); - root.left.right = new TreeNode(5); - expect(diameterOfBinaryTree(root)).toBe(3); - }); + const root = new TreeNode(1) + root.left = new TreeNode(2) + root.right = new TreeNode(3) + root.left.left = new TreeNode(4) + root.left.right = new TreeNode(5) + expect(diameterOfBinaryTree(root)).toBe(3) + }) it('should work for a skewed tree where diameter does not pass through root', () => { // 1 @@ -38,23 +38,22 @@ describe('Diameter of a Binary Tree', () => { // 5 6 // / \ // 7 8 - const root = new TreeNode(1); - root.left = new TreeNode(2); - root.left.left = new TreeNode(3); - root.left.right = new TreeNode(4); - root.left.right.left = new TreeNode(5); - root.left.right.right = new TreeNode(6); - root.left.right.left.left = new TreeNode(7); - root.left.right.right.right = new TreeNode(8); + const root = new TreeNode(1) + root.left = new TreeNode(2) + root.left.left = new TreeNode(3) + root.left.right = new TreeNode(4) + root.left.right.left = new TreeNode(5) + root.left.right.right = new TreeNode(6) + root.left.right.left.left = new TreeNode(7) + root.left.right.right.right = new TreeNode(8) // CORRECTED: The longest path is 7 -> 5 -> 4 -> 6 -> 8, which has 4 edges. - expect(diameterOfBinaryTree(root)).toBe(4); - }); + expect(diameterOfBinaryTree(root)).toBe(4) + }) it('should return 0 for a null or single-node tree', () => { - expect(diameterOfBinaryTree(null)).toBe(0); - const singleNode = new TreeNode(1); - // Typo fixed here - expect(diameterOfBinaryTree(singleNode)).toBe(0); - }); -}); + expect(diameterOfBinaryTree(null)).toBe(0) + const singleNode = new TreeNode(1) + expect(diameterOfBinaryTree(singleNode)).toBe(0) + }) +}) From 4b0e9e998a37cab9717e23ae51b42a3e50825b30 Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:27:52 +0530 Subject: [PATCH 13/14] Update DiameterOfBinaryTree.js From 11d6f9999d5af50576015907e6d21e958221e03d Mon Sep 17 00:00:00 2001 From: Rinki Jhunjhunwala <137408310+RinkiJhunjhunwala@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:29:36 +0530 Subject: [PATCH 14/14] Update DiameterOfBinaryTree.test.js --- Trees/test/DiameterOfBinaryTree.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Trees/test/DiameterOfBinaryTree.test.js b/Trees/test/DiameterOfBinaryTree.test.js index a238fb3291..aa851dd1e6 100644 --- a/Trees/test/DiameterOfBinaryTree.test.js +++ b/Trees/test/DiameterOfBinaryTree.test.js @@ -3,14 +3,13 @@ */ class TreeNode { constructor(value) { - this.value = value; - this.left = null; - this.right = null; + this.value = value + this.left = null + this.right = null } } -import { diameterOfBinaryTree } from '../DiameterOfBinaryTree'; - +import { diameterOfBinaryTree } from '../DiameterOfBinaryTree' describe('Diameter of a Binary Tree', () => { it('should calculate the correct diameter for a standard tree', () => { @@ -57,3 +56,4 @@ describe('Diameter of a Binary Tree', () => { expect(diameterOfBinaryTree(singleNode)).toBe(0) }) }) +