Editar: Si su estructura de datos tiene punteros padres, utilícelos en lugar de buscar sus descendientes en el árbol. Si no, considere agregarlos. Vea la respuesta de whiskeysierra para una solución con sugerencias para padres. Solo si agregarlos no es posible, considere esta respuesta.
Las respuestas actuales tienen dos bucles a través de los niños (uno en children.contains()
, uno más tarde).
Esta variante puede ser un poco más eficiente (pero no cambia la clase O), y es un poco más corta. (Si los niños es un conjunto con rápida contiene-cheque (como HashSet) y, a menudo la jerarquía no es tan profunda (por lo que no es necesario en absoluto recursivo), las otras respuestas son mejores.)
public boolean isDescendant(Member x) {
for(Member child : children) {
if(child.equals(x) || child.isDescendant(x))
return true;
}
return false;
}
Si un nodo se considera un descendiente de sí mismo, puede escribir así:
public boolean isDescendant(Member x) {
if(equals(x))
return true;
for(Member child : children) {
if(child.isDescendant(x))
return true;
}
return false;
}
No ha dicho si los nodos forman un gráfico cíclico o un DAG/árbol, y si un nodo hijo tiene un enlace a su nodo padre. –