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); }