diff --git a/cs/longest-zigzag-path-in-a-binary-tree.cs b/cs/longest-zigzag-path-in-a-binary-tree.cs new file mode 100644 index 0000000..2d9dcb6 --- /dev/null +++ b/cs/longest-zigzag-path-in-a-binary-tree.cs @@ -0,0 +1,41 @@ +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) + ); +}