The answer to all your questions is all "yes" technically, but the way you've worded them makes me think just saying "yes" will be a bit misleading to you. So let's take a real-world example. I'll use pseudo-Scala syntax since that's fairly similar to a lot of imperative languages.
Let's construct a tree data structure from scratch and see how to update it.
abstract class BinaryTreeOfInts
final class Leaf(final value: Int) extends BinaryTreeOfInts
final class Node(final value: Int, final left: BinaryTreeOfInts, final right: BinaryTreeOfInts) extends BinaryTreeOfInts
All fields here are by reference.
So because everything is final here, we've constructed an immutable tree. You cannot update any of these values once it's been constructed.
Let's see how you might construct the following binary tree
5
/ \
6 1
/ \
2 3
myTree = Node(
5,
Leaf(6)
Node(
1,
Leaf(2),
Leaf(3)
)
I want to modify 5 now to be 10
newTree = Node(10, myTree.left, myTree.right)
Done. This is effectively one operation. newTree and myTree are both still immutable, but there's a ton of sharing going on. Now this is the best case scenario. Modifying a leaf is the worst case scenario, but even there only requires as many operations as there are levels in your tree, which, as long as you have a fairly balanced tree, only grows logarithmically in the number of elements you have.
To illustrate let's make another change, this time changing 3 to 30.
anotherTree = Node(
newTree.value,
newTree.left,
Node(
newTree.right.value,
newTree.right.left,
Leaf(30)
)
)
Note I've had to instantiate a new Node for each level of the tree, and I've made a new Leaf, but otherwise everything else is shared. Now this is the low-level way of performing these changes. There are various APIs and tricks to make this look a lot cleaner in code so writing this out isn't as tedious, but I figured I'd present the low-level way to make things less magical.
BTW, the logarithmic time factor to update a leaf is why you will often see logarithmic factors in time complexities of various operations on immutable data structures.