42 lines
1.2 KiB
C#
42 lines
1.2 KiB
C#
|
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)
|
||
|
);
|
||
|
}
|