Traverse the tree level by level using a zigzag pattern:
At odd-numbered levels (1-indexed), traverse nodes from left to right.
At even-numbered levels, traverse nodes from right to left.
While traversing a level in the specified direction, process nodes in order and stop immediately before the first node that violates the condition:
At odd levels: the node does not have a left child.
At even levels: the node does not have a right child.
Only the nodes processed before this stopping condition contribute to the level sum.
Return an integer array ans where ans[i] is the sum of the node values that are processed at level i + 1.
Example 1:
Input:root = [5,2,8,1,null,9,6]
Output:[5,8,0]
Explanation:
βββββββ
At level 1, nodes are processed left to right. Node 5 is included, thus ans[0] = 5.
At level 2, nodes are processed right to left. Node 8 is included, but node 2 lacks a right child, so processing stops, thus ans[1] = 8.
At level 3, nodes are processed left to right. The first node 1 lacks a left child, so no nodes are included, and ans[2] = 0.
Thus, ans = [5, 8, 0].
Example 2:
Input:root = [1,2,3,4,5,null,7]
Output:[1,5,0]
Explanation:
At level 1, nodes are processed left to right. Node 1 is included, thus ans[0] = 1.
At level 2, nodes are processed right to left. Nodes 3 and 2 are included since both have right children, thus ans[1] = 3 + 2 = 5.
At level 3, nodes are processed left to right. The first node 4 lacks a left child, so no nodes are included, and ans[2] = 0.
Thus, ans = [1, 5, 0].
Constraints:
The number of nodes in the tree is in the range [1, 105].
-105 <= Node.val <= 105
Solutions
Solution 1: BFS
Thinking
Recursively gathering each level and then summing a zigzag prefix is heavier than necessary. The required sum stops at the first node that lacks the child implied by the current direction; it is not the sum of the whole level.
BFS already yields nodes level by level. A flag \(\textit{left}\) records the direction: enqueue the next level first, then scan this level from the left or the right, adding a node only while its corresponding child exists.
Flip the flag and replace the queue after each level so a single BFS produces the entire answer.
We use a queue \(q\) to perform a level-order traversal, and define a boolean variable \(\textit{left}\) to indicate the traversal direction of the current level. For each level, we first add the nodes of the next level to the queue \(nq\), and then compute the sum of the node values of the current level, denoted by \(s\), according to the value of \(\textit{left}\), and append \(s\) to the answer array. Finally, we update the value of \(\textit{left}\) and assign \(nq\) to \(q\) to continue traversing the next level.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the number of nodes in the binary tree.
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funczigzagLevelSum(root*TreeNode)[]int64{ans:=[]int64{}q:=[]*TreeNode{root}left:=trueforlen(q)>0{nq:=[]*TreeNode{}for_,node:=rangeq{ifnode.Left!=nil{nq=append(nq,node.Left)}ifnode.Right!=nil{nq=append(nq,node.Right)}}m:=len(q)varsint64=0fori:=0;i<m;i++{varnode*TreeNodeifleft{node=q[i]}else{node=q[m-i-1]}varchild*TreeNodeifleft{child=node.Left}else{child=node.Right}ifchild==nil{break}s+=int64(node.Val)}ans=append(ans,s)left=!leftq=nq}returnans}