Na, dann antworte ich mal, um zu helfen -)
Du solltest deine beiden Eigenschaften FirstChild und FirstSibling auf jeden Fall vom Typ Knoten machen (die Knoten sind untereinander verbunden, nicht die Daten).
Dann bekommt deine Knotenklasse nur noch EINE zusätzliche Eigenschaft mit den Daten.
Am einfachsten ist es, wenn du einfach ein Interface IDaten definierst und dieses dann als Typ für den Knoten verwendest. So braucht der Knoten nichts direkt von T zu wissen.
Wenn du jedoch deinen gesamten Baum, so anlegen willst, daß immer nur der selbe Datentyp für T benutzt wird, dann mach auch einfach den Baum sowie die Knoten generisch: Tree<T> und Knoten<T>.
Ich hoffe, dies reicht aus, um dir Hilfe zur Selbsthilfe zu geben...
P.S: 'where' kann man auch auf Klassen anwenden, jedoch sollten als Datentypen immer Schnittstellen (Interfaces) angegeben werden, sonst kann man ja keine Methoden auf die Objekte vom Typ T anwenden (außer die von Object). Es gibt auch noch 'class' und 'struct' als Möglichkeit, um nur Referenz- bzw. Werttypen zuzulassen.