There are very good reasons to use a tree without parent pointers, and memory usage is not a problem.
In the world of functional programming (I think Lisp, schema, standard ML, OCaml, Haskell, F #, etc.) trees and linked lists are very common data structures, so even in C they think a lot about trees and lists are influenced FP. Trees and lists are recursively defined (the tree is either a leaf or a node interior whose children are trees, and the list is nil
or node with a data element and list attached) and they are almost always implemented as immutable data structures. Consistency is useful because it does parallelism cleanup (without visible programmers), data sharing between functions is better (no need to copy data) and simple.
The problem with the parent pointer or doubly linked list is that the sudden immutability exits the window. With an immutable object, you must specify everything about the object at the time of creation. So, if you want to maintain immutability, you cannot create a node until its children are created (since these children must be specified at creation time), but you also cannot set parent pointers to children before the parent was created ( as the parent does not exist). In other words, immutability does not play well with circular dependencies. Similarly, you cannot create a doubly linked list without any mutation, because without a mutation you cannot create the first node until the second node is created, and you cannot set the previous pointer to the second node until the first node is created.
FP users manage to write a lot of code with strictly unchanged data structures and prove many useful properties for loading. Of course, saving parent pointers makes the programmer’s life difficult, because as soon as you change one node in the tree, you have to make changes to all the parent pointers of your children, which is a pain.
Because reflections on lists and trees are influenced by FP, which does not include parent pointers or doubly linked lists, and because parent pointer support is a complex business that can introduce errors, many C-tree implementations do not use parent pointers.
Also, another note: you are asking about using linked lists compared to doubly linked lists for stacks and queues. There is no need to use a doubly linked list to implement the stack, because you do not need efficiency when traversing any element except the first (and the second if the stack is changed). There is a cute trick for implementing a two-stack queue that provides amortization for operations of a constant time queue. However, if you do not use this, the queue is also a decent use case for a doubly linked list or array.