private double EvaluateBinaryOperation(BinaryNodeItem left, BinaryNodeItem right)
 {
     return(right.Operator switch
     {
         BinaryOperatorType.Add => Evaluate(left.Item) + Evaluate(right.Item),
         BinaryOperatorType.Subtract => Evaluate(left.Item) - Evaluate(right.Item),
         BinaryOperatorType.Multiply => Evaluate(left.Item) * Evaluate(right.Item),
         BinaryOperatorType.Divide => Evaluate(left.Item) / Evaluate(right.Item),
         BinaryOperatorType.Power => Math.Pow(Evaluate(left.Item), Evaluate(right.Item)),
         _ => throw new InvalidOperationException("Unknown operator type!")
     });
        private BinaryNodeItem EvaluationBinaryNodeLevelInLeftOrder(IReadOnlyCollection <BinaryNodeItem> input)
        {
            if (input.Count <= 1)
            {
                return(input.FirstOrDefault());
            }

            var left  = input.First();
            var right = input.Skip(1).ToArray();

            foreach (var item in right)
            {
                var value = EvaluateBinaryOperation(left, item);
                left = new BinaryNodeItem(left.Operator, new UnaryValueNode(value));
            }

            return(left);
        }