public static Node <State> TreeSearchMetod(IProblem <State> problem, IFringe <Node <State> > fringe, Enum method)
        {
            Func <State, double> calculatePriorityForBestFirstSearch = newState =>
                                                                       problem.CalculateDistanceToDestinyCity(newState);
            //odleglosc w lini prostej

            Func <Node <State>, State, double> calculatePriorityForAStar = (parent, newState) =>
                                                                           problem.CalculatePriorityForAStar(parent.StateOfNode, newState);

            //Linia prosta + odleglosc krawedziowa, pozniej dodana jest
            //droga juz pokonana


            fringe.SetCompareMethod(ComparePriority);
            fringe.Add(new Node <State>(problem.InitialState, null, 1, double.MaxValue)); //tworzy root na stosie

            while (!fringe.IsEmpty)
            {
                var node = fringe.Pop();              //zdjecie ze stosu
                if (problem.IsGoal(node.StateOfNode)) //sprawdzenie zdjetego elementu ze stosu
                {
                    return(node);
                }

                foreach (var actualState in problem.Expand(node.StateOfNode))
                {
                    //foreach-a z możliwymy stanami, to tam sprawdzam czy dany stan z IListy
                    // już nie wystąpił, wywołując OnPathToRoot,
                    if (!node.OnPathToRoot(node.StateOfNode, actualState, problem.Compare))
                    //Wykonuje sie gdy nie ma znalezionego identycznego stanu
                    {
                        var nodeToAdd = new Node <State>(actualState, node, node.StepsForSolution++,
                                                         CalculatePriorityMethod(method, calculatePriorityForBestFirstSearch,
                                                                                 calculatePriorityForAStar, node, actualState));

                        nodeToAdd.TotalRoad = node.TotalRoad +
                                              problem.GetDistanceToCity(node.StateOfNode, nodeToAdd.StateOfNode);
                        fringe.Add(nodeToAdd);
                        CountOfSteps++;
                    }
                }
            }

            return(null);
        }