Given the root of a binary tree, return the number of nodes where the value of the node is equal to the sum of the values of its descendants.
A descendant of a node x is any node that is on the path from node x to some leaf node. The sum is considered to be 0 if the node has no descendants.
Example 1:
Input: root = [10,3,4,2,1]
Output: 2
Explanation:
For the node with value 10: The sum of its descendants is 3+4+2+1 = 10.
For the node with value 3: The sum of its descendants is 2+1 = 3.
Example 2:
Input: root = [2,3,null,2,null]
Output: 0
Explanation:
No node has a value that is equal to the sum of its descendants.
Example 3:
Input: root = [0]
Output: 1
For the node with value 0: The sum of its descendants is 0 since it has no descendants.
Constraints:
The number of nodes in the tree is in the range [1, 105].
0 <= Node.val <= 105
Solutions
Solution 1
Thinking
Each node is compared with the sum of its descendants. A fresh walk per node is quadratic.
A post-order DFS returns the subtree sum: if left plus right equals the node, increment the answer, then return the node plus both children. One traversal suffices.
1 2 3 4 5 6 7 8 91011121314151617181920
# 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:defequalToDescendants(self,root:Optional[TreeNode])->int:defdfs(root):ifrootisNone:return0l,r=dfs(root.left),dfs(root.right)ifl+r==root.val:nonlocalansans+=1returnroot.val+l+rans=0dfs(root)returnans
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcequalToDescendants(root*TreeNode)(ansint){vardfsfunc(*TreeNode)intdfs=func(root*TreeNode)int{ifroot==nil{return0}l,r:=dfs(root.Left),dfs(root.Right)ifl+r==root.Val{ans++}returnroot.Val+l+r}dfs(root)return}
Solution 2: Explicit Stack
Thinking
Each node is compared with the sum of every descendant. A fresh walk per node is quadratic. Post-order already has both subtree sums when a node is finished, so one traversal can test the node and pass the total upward.
\(n\) reaches \(10^5\). Post-order enters the left child first, so a left chain overflows the call stack before the sums are done. Values reach \(10^5\), and a subtree sum can reach \(10^{10}\), which does not fit in a 32-bit integer.
The descendant sum is known only after both children return. An explicit stack separates βexpand the childrenβ from βboth children have returned,β and the completion step reads the two subtree sums. Those sums are 64-bit integers. When their total equals the node, the answer increases, and the nodeβs own value is added for its parent.
Each node is pushed once. A missing child contributes \(0\).
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcequalToDescendants(root*TreeNode)(ansint){sub:=map[*TreeNode]int{}typeframestruct{node*TreeNodestateint}stk:=[]frame{}ifroot!=nil{stk=append(stk,frame{root,0})}forlen(stk)>0{cur:=stk[len(stk)-1]stk=stk[:len(stk)-1]node:=cur.nodeifcur.state==0{stk=append(stk,frame{node,1})ifnode.Right!=nil{stk=append(stk,frame{node.Right,0})}ifnode.Left!=nil{stk=append(stk,frame{node.Left,0})}continue}l,r:=0,0ifnode.Left!=nil{l=sub[node.Left]}ifnode.Right!=nil{r=sub[node.Right]}ifl+r==node.Val{ans++}sub[node]=node.Val+l+r}return}