public TreeNode<T> Left{get; set;}
public TreeNode<T> Right{get; set;}
public static implicit operator TreeNode<T>((TreeNode<T>, T, TreeNode<T>) t) => new TreeNode<T>(t.Item2) {Left = t.Item1, Right=t.Item3};
public static implicit operator TreeNode<T>((T, T, TreeNode<T>) t) => new TreeNode<T>(t.Item2) {Left = new TreeNode<T>(t.Item1), Right=t.Item3};
public static implicit operator TreeNode<T>((TreeNode<T>, T, T) t) => new TreeNode<T>(t.Item2) {Left = t.Item1, Right=new TreeNode<T>(t.Item3)};
public static implicit operator TreeNode<T>((T, T, T) t) => new TreeNode<T>(t.Item2) {Left = new TreeNode<T>(t.Item1), Right=new TreeNode<T>(t.Item3)};
public static void Main()
TreeNode<int> tree = ( ( 1, 3, null), 2, ( ( null, 3, 4 ), 5, ( 6, 7, 8 ) ) );
Console.WriteLine(tree.Left.Key);