def greedy(self):
        visited = []
        to_visit = [deepcopy(self.__root)]

        while len(to_visit) > 0:
            if len(to_visit) == 0:
                return None

            current_node = to_visit.pop(0)
            if current_node not in visited:
                visited.append(current_node)

            if Problem.get_final(current_node):
                return current_node

            for expanded in Problem.expand(current_node):
                if expanded not in visited:
                    if Problem.get_final(expanded):
                        return expanded
                    visited.append(expanded)
                    to_visit = [expanded] + to_visit

            to_visit = sorted(to_visit,
                              key=lambda state: Problem.heuristics(state),
                              reverse=True)

        return None
    def dfs(self):
        visited = []
        to_visit = [deepcopy(self.__root)]
        final = []

        while len(to_visit) > 0:
            if len(to_visit) == 0:
                return None

            current_node = to_visit.pop()

            if current_node not in visited:
                visited.append(current_node)

            if Problem.get_final(current_node):
                final.append(current_node)

            for expanded in Problem.expand(current_node):
                if expanded not in visited:
                    visited.append(expanded)
                    to_visit += [expanded]

        return final