I'll start with the second question.
What is the difference between LambdaExpression and BinaryExpression?
The same difference between a function and an expression within the function.
The BinaryExpression is an expression between two (binary) nodes
x > 5 
This is a binary expression of type GreaterThan which its left side is a parameter named x and its right side is a constant that has a value of 5.
Expression<Func<double, bool>> add = x => x > 5;
This is a lambda expression that has a binary expression body. (check the add.Body)
This is a naive solution for your question.
class Program
{
    static void Main(string[] args) {
        Expression<Func<double, bool>> predicate = x => x > 3 && x > 4;
        var visitor = new BinaryExpressionVisitor();
        predicate = (Expression<Func<double, bool>>)visitor.Visit(predicate);
    }
}
public class BinaryExpressionVisitor : ExpressionVisitor
{
    private bool root = true;
    private List<ConstantExpression> constants = new List<ConstantExpression>();
    private List<BinaryExpression> binaryExpressions = new List<BinaryExpression>();
    private HashSet<ParameterExpression> @params = new HashSet<ParameterExpression>();
    protected override Expression VisitBinary(BinaryExpression node) {
        if (IsSimpleBinaryExpression(node)) {
            binaryExpressions.Add(node);
        }
        else if (node.NodeType != ExpressionType.AndAlso) {
            return node;
        }
        if (root) {
            root = false;
            Visit(node.Right);
            Visit(node.Left);
            if (@params.Count == 1) {
                var @param = @params.ElementAt(0);
                var hashSet = new HashSet<ExpressionType>(binaryExpressions.Select(be => be.NodeType));
                if (hashSet.Count == 1) {
                    var binaryExpression = binaryExpressions[0];
                    var nodeType = binaryExpression.NodeType;
                    var constant = GetConstantByNodeType(nodeType);
                    return Expression.MakeBinary(nodeType, @param, constant);
                }
            }
        }
        return base.VisitBinary(node);
    }
    protected override Expression VisitConstant(ConstantExpression node) {
        constants.Add(node);
        return base.VisitConstant(node);
    }
    protected override Expression VisitParameter(ParameterExpression node) {
        @params.Add(node);
        return base.VisitParameter(node);
    }
    private bool IsSimpleBinaryExpression(Expression node) {
        return node.NodeType == ExpressionType.GreaterThan || node.NodeType == ExpressionType.LessThan;
    }
    private ConstantExpression GetConstantByNodeType(ExpressionType expressionType) {
        var values = constants.Select(c => c.Value);
        var value = expressionType == ExpressionType.GreaterThan ? values.Max() : values.Min();
        return Expression.Constant(value);
    }
}