Memoizing a tree's parent pointers in Python
Nodes are usually used internally within the tree and are created inside the insert function of your tree. This is to hide the implementation for users as well as prevent any corruptions that could occur due to external mutability. This isn't Python specific, but more about data structures in general. Data is encapsulated in the structure and use specific operations (functions) for retrieval/mutations.
I'm not sure what your use case is here, but I'd deter you from allowing Nodes to be used outside of the Tree class (if possible).
To traverse the tree bottom up, here are two methods you can try:

Reverse level order traversal

implement the binary tree with a list internally. Then if you wanted to traverse from the bottom up, the last item in the list would certainly be the node at the bottom of the tree and you can get its parent via a list index (you can work this out by reading the previous link).