aneira fácil de encontrar uma subárvore em uma árvo

Estou escrevendo um código que usa uma Tree (uma árvore regular que pode ter um número ilimitado de nós, mas sem crossover, ou seja, dois nós pais não apontarão o mesmo nó filho). Enfim, duas coisas:

1) Existem algoritmos conhecidos para encontrar uma subárvore dentro de uma árvor

2) Existem bibliotecas Java (ou bibliotecas para esse assunto) que já implementam esse algoritmo? Mesmo se não houver, alguém pode recomendar uma boa biblioteca de árvores Java de uso geral?

Eu quero usar essas árvores para armazenar dados em um formato de árvore, não para os recursos de pesquis

Para expandir um pouco: estou usando a árvore como parte do jogo para manter um histórico do que acontece quando certos eventos acontecem. Por exemplo, um A pode atingir um B que pode atingir dois A que podem atingir outros dois A etc.

Isso seria algo como:

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

Claro que há mais do que apenas A e B. O que eu quero fazer é (para um sistema de conquistas) ser capaz de saber quando, digamos, um A atingiu dois A's:

  A
 / \
A   A

Quero saber com facilidade se a primeira árvore contém essa subárvore. E não quero escrever todo o código para isso, se não for necessário:)

questionAnswers(4)

yourAnswerToTheQuestion