Algorytmy wyszukiwania wymagają struktury danych do śledzenia drzewa wyszukiwania. Węzeł w drzewie jest reprezentowany przez strukturę danych z czterema komponentami:
* node.STATE: stan, któremu odpowiada węzeł;
* node.PARENT: węzeł w drzewie, który wygenerował ten węzeł;
* node.ACTION: akcja, która została zastosowana do stanu rodzica w celu wygenerowania tego węzła;
* node.PATH-COST: całkowity koszt ścieżki od stanu początkowego do tego węzła. We wzorach matematycznych używamy g(węzeł) jako synonimu PATH-COST.
Podążanie za wskaźnikami PARENT z powrotem z węzła pozwala nam odzyskać stany i działania na ścieżce do tego węzła. Robienie tego z węzła celu daje nam rozwiązanie. Potrzebujemy struktury danych do przechowywania granicy. Właściwym wyborem jest jakaś kolejka, ponieważ operacje na granicy to:
* IS-EMPTY(frontier) zwraca wartość true tylko wtedy, gdy na granicy nie ma żadnych węzłów.
* POP(frontier) usuwa górny węzeł z granicy i zwraca go.
* TOP(granica) zwraca (ale nie usuwa) górny węzeł granicy.
* ADD(node, frontier) wstawia węzeł we właściwe miejsce w kolejce.
W algorytmach wyszukiwania wykorzystywane są trzy rodzaje kolejek:
* Kolejka priorytetowa najpierw wyskakuje węzeł z minimalnym kosztem zgodnie z funkcją oceny f. Jest używany w wyszukiwaniu „najlepszy-pierwszy”.
* Kolejka FIFO lub kolejka pierwszy-w-pierwszy-wyjściowy najpierw wyskakuje węzeł, który został dodany do kolejki jako pierwszy; zobaczymy, że jest używany w przeszukiwaniu wszerz.
* Kolejka LIFO lub kolejka ostatnia-pierwsza-pierwsza (znana również jako stos) wyskakuje jako pierwszy ostatnio dodany węzeł; zobaczymy, że jest używany w poszukiwaniach dogłębnych.
Osiągnięte stany mogą być przechowywane jako tablica przeglądowa (np. tablica mieszająca), w której każdy klucz jest stanem, a każda wartość jest węzłem dla tego stanu.