public class Solution { public enum Direction { Left, Right, } private static Direction Next(Direction d) => d switch { Direction.Left => Direction.Right, Direction.Right => Direction.Left, _ => throw new ArgumentException("Invalid direction") }; private static TreeNode? Get(Direction d, TreeNode n) => d switch { Direction.Left => n.left, Direction.Right => n.right, _ => throw new ArgumentException("Invalid direction") }; private int LongestZigZag(TreeNode node, int steps, Direction direction) { if (node == null) { return steps; } // Current path var maxSteps = steps; // Switching direction maxSteps = Math.Max(maxSteps, LongestZigZag(Get(direction, node), steps + 1, Next(direction))); // Starting new path maxSteps = Math.Max(maxSteps, LongestZigZag(Get(Next(direction), node), 0, direction)); return maxSteps; } public int LongestZigZag(TreeNode root) => Math.Max( LongestZigZag(root, -1, Direction.Left), LongestZigZag(root, -1, Direction.Right) ); }