public void RemoveChild(Node node) { if (node != this && Children.Contains(node)) { Children.Remove(node); } }
It is safe to call Children.Remove(node) even if node is null, so you can spare the Contains() check. node != this - I suppose this should be avoided in the Add method - but what can't this be removed if provided as node? You could consider to return the bool values returned from Children.Remove(node), to let the client known if the operation was succesful or not.
You could consider to make the Node class generic:
public class Node<T>
{
public T Value { get; }
...
}
Where is the Search algorithm to review? :-)