using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
BinaryTree<int> binaryTree = new BinaryTree<int>(15);
ISet<BinaryTree<int>> binaryTreeChildren = binaryTree.ITreeDerivedChildren;
ITree<int> iTree = binaryTree;
ISet<ITree<int>> iTreeChildren = iTree.IRecursiveDerivedChildren;
IRecursive iRecursive = iTree;
ISet<IRecursive> iRecursiveChildren = iRecursive.IRecursiveChildren;
public interface IRecursive {
ISet<IRecursive>? IRecursiveChildren { get; }
public interface IRecursive<TChild> : IRecursive where TChild : IRecursive<TChild> {
ISet<TChild>? IRecursiveDerivedChildren { get; }
public interface ITree<TValue> : IRecursive<ITree<TValue>> {
TValue Value { get; set; }
public interface ITree<TChild, TValue> : ITree<TValue> where TChild : ITree<TChild, TValue> {
ISet<TChild>? ITreeDerivedChildren { get; }
public class BinaryTree<TValue> : ITree<BinaryTree<TValue>, TValue> {
public TValue Value { get; set; }
public bool Leaf { get; }
public bool IsParent => !Leaf;
public BinaryTree<TValue>? Left { get; }
public BinaryTree<TValue>? Right { get; }
public ISet<IRecursive>? IRecursiveChildren => Leaf ? null : new HashSet<IRecursive>(2) { Left, Right };
public ISet<ITree<TValue>>? IRecursiveDerivedChildren => Leaf ? null : new HashSet<ITree<TValue>>(2) { Left, Right };
public ISet<BinaryTree<TValue>>? ITreeDerivedChildren => Leaf ? null : new HashSet<BinaryTree<TValue>>(2) { Left, Right };
public BinaryTree(TValue value) {