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
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}