I'm a TA for a major American university teaching a Java class, and this is how I always explain polymorphism to my students:
There are actually two things going on here, which are very similar: polymorphism and dynamic binding.
Polymorphism is simply defined as when the reference type and object type are different. The classic example is Animal anim = new Dog(); with Dog extending Animal. The reference type of anim (Animal) is different than its object type (Dog) so anim is a polymorphic reference.
The second part is dynamic binding, which has to do with what method is actually run when you make a method call. Dynamic binding means that the method that actually runs is the method that is farthest down the class hierarchy between the reference type and object type. You can also think of it as the method the belongs to the class closest to the object type.
The class hierarchy is the tree you see where each class is a branch of its parent class. Since Java is single-inheritance (C++ and others allow you to extend multiple classes, but in Java you can only extend one) the class hierarchy is typically a tree. Keep in mind that interfaces and abstract classes are also included in the class hierarchy, so it's not necessarily a tree due to interfaces.
The reason that polymorphism and dynamic binding are used so often together is that polymorphism doesn't make much sense without dynamic binding. Being able to have the method that runs depend on the object type instead of the reference type is the entire point of polymorphism!