Manera fácil de encontrar Subtree en un árbol

Estoy escribiendo un código que usa un árbol (un árbol normal que puede tener un número ilimitado de nodos, pero no cruzado, es decir, dos nodos principales no apuntarán al mismo nodo secundario). De todos modos, dos cosas:

1) ¿Existen algoritmos bien conocidos para encontrar un subárbol dentro de un árbol?

2) ¿Hay alguna biblioteca de Java (o alguna biblioteca) que ya implemente este algoritmo? Incluso si no hay ninguno, ¿alguien puede recomendar alguna buena biblioteca de árbol de Java de propósito general?

Quiero usar estos árboles para mantener los datos en un formato de árbol, no para sus capacidades de búsqueda.

Para expandir un poco: estoy usando el árbol como parte del juego para mantener un historial de lo que sucede cuando suceden ciertos eventos. Por ejemplo, una A puede golpear a una B que puede golpear a dos A que pueden golpear a otras dos A, etc.

Eso sería algo así como:

    A
    |
    B
   /
  A 
 / \  
A   A
   / \
  A   A

Por supuesto, hay algo más que A y B. Lo que quiero hacer es (para un sistema de logros) saber cuándo, por ejemplo, una A ha alcanzado dos A:

  A
 / \
A   A

Quiero poder saber fácilmente si el primer árbol contiene ese subárbol. Y no quiero tener que escribir todo el código para hacerlo si no tengo que:)

Respuestas a la pregunta(4)

Su respuesta a la pregunta