You are given the root of a complete binary tree.
A node x is called dominant if its value is equal to the maximum value among all nodes in the subtree rooted at x.
Return the number of dominant nodes in the tree.
Example 1:

Input: root = [5,3,8,2,4,7,1]
Output: 5
Explanation:
[8, 7, 1].Example 2:

Input: root = [1,2,3,1,2]
Output: 4
Explanation:
[2, 1, 2] is dominant because its value is the maximum value in its subtree.
Constraints:
[1, 105].1 <= Node.val <= 109Problem Overview: You need to count how many nodes in a binary tree are dominant. A node is dominant if its value is greater than or equal to every value on the path from the root to that node. The main challenge is tracking the maximum value seen so far while traversing the tree.
Approach 1: Path Recalculation DFS (O(nh) time, O(h) space)
This brute force approach checks every node by recomputing the maximum value along the root-to-node path. You perform a DFS traversal and maintain the current path in an array or stack. For each node, iterate through the stored path to verify whether the node is dominant. This approach is useful for understanding the condition definition, but repeated path scans make it inefficient on skewed trees where height h becomes large.
Approach 2: DFS with Running Maximum (O(n) time, O(h) space)
The optimal solution uses Depth First Search and carries the maximum value seen so far during recursion. At each node, compare node.val with maxSoFar. If the current value is greater than or equal to the running maximum, increment the answer. Then recurse into the left and right subtrees with max(maxSoFar, node.val). Every node is visited exactly once, which gives linear time complexity.
This approach works naturally with recursive Binary Tree traversal because each recursive call already represents a root-to-node path. You avoid extra storage for full paths and reduce repeated comparisons. The recursion stack uses at most O(h) space, where h is the tree height.
Approach 3: Iterative DFS with Stack (O(n) time, O(h) space)
If recursion depth is a concern, you can simulate DFS using an explicit stack. Store pairs of (node, maxSoFar) while traversing the tree. Pop a node, evaluate whether it is dominant, update the running maximum, and push its children onto the stack. This iterative version avoids recursion limits and still preserves the same asymptotic complexity.
Recommended for interviews: Interviewers typically expect the DFS with running maximum approach. The brute force solution demonstrates understanding of the dominant-node condition, but the optimized DFS shows you can eliminate redundant work using state propagation during traversal. Recursive DFS is usually the cleanest implementation, while iterative DFS is preferred when stack overflow is a concern.
Solutions for this problem are being prepared.
Try solving it yourself| Approach | Time | Space | When to Use |
|---|---|---|---|
| Path Recalculation DFS | O(nh) | O(h) | Useful for understanding the problem before optimization |
| DFS with Running Maximum | O(n) | O(h) | Best general solution for interviews and production code |
| Iterative DFS with Stack | O(n) | O(h) | Preferred when recursion depth may exceed language stack limits |
3997. Count Dominant Nodes in a Binary Tree (Leetcode Medium) • Programming Live with Larry • 78 views views
Watch 4 more video solutions →Practice Count Dominant Nodes in a Binary Tree with our built-in code editor and test cases.
Practice on FleetCodePractice this problem
Open in Editor