Mental Model
We want to find how many pieces (nodes) are in a tree by visiting each piece once.
Analogy: Imagine counting all the apples on a tree by picking each branch and counting apples on it, then adding them up.
1 / \ 2 3 / 4
1 / \ 2 3 / 4
1 (count=1)
1 -> 2 (count=1 for node 2)
1 -> 2 -> 4 (count=1 for node 4)
4 (leaf node)
2 subtree count = 2
3 (count=1)
3 (leaf node)
Total nodes = 4
1 -> 2 -> 4 -> 3 -> null Total nodes: 4
class TreeNode { val: number; left: TreeNode | null; right: TreeNode | null; constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { this.val = val === undefined ? 0 : val; this.left = left === undefined ? null : left; this.right = right === undefined ? null : right; } } function countNodes(root: TreeNode | null): number { if (root === null) return 0; // base case: no node here const leftCount = countNodes(root.left); // count nodes in left subtree const rightCount = countNodes(root.right); // count nodes in right subtree return leftCount + rightCount + 1; // add current node } // Driver code to build tree and count nodes const node4 = new TreeNode(4); const node2 = new TreeNode(2, node4, null); const node3 = new TreeNode(3); const root = new TreeNode(1, node2, node3); const totalNodes = countNodes(root); console.log("1 -> 2 -> 4 -> 3 -> null"); console.log("Total nodes:", totalNodes);
if (root === null) return 0; // base case: no node hereconst leftCount = countNodes(root.left); // count nodes in left subtreeconst rightCount = countNodes(root.right); // count nodes in right subtreereturn leftCount + rightCount + 1; // add current nodeif (root === null) return 0; // base case: no node here
return leftCount + rightCount + 1; // add current node
const leftCount = countNodes(root.left); // count nodes in left subtree