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:
The leaf nodes with values 2, 4, 7, and 1 are dominant.
The node with value 8 is dominant because its value is the maximum value in its subtree [8, 7, 1].
Thus, the answer is 5.
Example 2:
Input:root = [1,2,3,1,2]
Output:4
Explanation:
The leaf nodes with values 1, 2, and 3 are dominant.
The node with value 2 whose subtree is [2, 1, 2] is dominant because its value is the maximum value in its subtree.
Thus, the answer is 4.
Β
Constraints:
The number of nodes in the tree is in the range [1, 105].
1 <= Node.val <= 109
The tree is guaranteed to be a complete binary tree.
Solutions
Solution 1: DFS
A node is dominant if its value equals the maximum value in the subtree rooted at it. Therefore, for each node, we only need the maximum values of its left and right subtrees, then compare them with the node itself.
Perform a bottom-up DFS: return \(-\infty\) for a null node (implemented with the language's minimum integer value), and for the current node compute \(\textit{mx} = \max(\textit{leftMax}, \textit{rightMax}, \textit{node.val})\). If \(\textit{mx} = \textit{node.val}\), the node is dominant and the answer is incremented by one. Finally return \(\textit{mx}\) for the parent node.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the number of nodes in the tree.
1 2 3 4 5 6 7 8 910111213141516171819202122
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclassSolution:defcountDominantNodes(self,root:TreeNode|None)->int:defdfs(node:TreeNode|None)->int:ifnodeisNone:return-infl=dfs(node.left)r=dfs(node.right)mx=max(l,r,node.val)ifmx==node.val:nonlocalansans+=1returnmxans=0dfs(root)returnans
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funccountDominantNodes(root*TreeNode)int{ans:=0vardfsfunc(*TreeNode)intdfs=func(node*TreeNode)int{ifnode==nil{returnmath.MinInt32}l:=dfs(node.Left)r:=dfs(node.Right)mx:=max(l,r,node.Val)ifmx==node.Val{ans++}returnmx}dfs(root)returnans}