Expression trees are an in-memory representation of an expression, e.g. an arithmetic or boolean expression.
For example, consider the arithmetic expression
a + b*2
Since * has a higher operator precedence than +, the expression tree is built like that:
[+]
/ \
a [*]
/ \
b 2
Having this tree, it can be evaluated for any values of a and b.
Additionally, you can transform it into other expression trees, for example to derive the expression.
When you implement an expression tree, I would suggest to create a base class
Expression. Derived from that, the class BinaryExpression would be used for all binary expressions, such as + and * . Then you could introduce a VariableReferenceExpression to reference variables (such as a and b), and another class ConstantExpression (for the 2 from the example).
The expression tree is in many cases built as the result of parsing an input (from the user directly, or from a file).
For evaluating the expression tree, I would suggest to use the Visitor pattern.