Hello amarnadh!
Neo4j stores relationships in linked lists (of pointers) based on relationship type. Imagine an Actor node has a single ACTED_IN relationship. Starting at this Actor node, cypher will go to that relationship type, and follow the pointer to the other node.
If a different Actor node has 12,345 ACTED_IN relationships, cypher will go to that relationship type, and track every one of those relationships.
So to your first question:
a) O(n) if you are tracking one relationship type back no further.
b) I believe this depends on your specific case. If you have 1 node with 2 children, and each of those children has 2 children, and so on, you are looking at exponential complexity based on the length of the path to reach the leaf node.
That being said, if you had a parent node with children nodes that have children nodes that have .. 10 layers deep, and each node has on average 5 children, you would have just under 10M paths to traverse.
Indexing helps when looking at properties of nodes (especially when finding the starting point in a query), but doesn't help for graph traversal.
A general principle for data models is to create something that prevents graph traversal exploding. If you think about the airline example from the documentation, AirportDay nodes were an efficient way to find flights. If they had used Airport nodes, a query would have to look at every flight for that airport for all time, which is orders of magnitude slower.
So look first at your data model and see if you can come up with something clever or useful that can make your searches focused (fewer relationships from each node, fewer layers, varying relationship types).
Hope that helps, and happy graphing!
V.Rupp