Modernizing the DOM Tree in Microsoft Edge
So new IE’s dom::node essentially looks as    struct node {
      element* parent;
      node *first_child, *next, *previous;
    }

And that was also my initial implementation of it in Sciter Engine (https://sciter.com) but after some testing I’ve found that these two structures work better:    struct node {
      element* parent;
      uint node_index; // its index in parent->children
    }
    struct element: node {
      vector children;
    }

a) better suits DOM manipulation/traversal needs, 
b) more compact and faster, 
c) more CSS friendly (for things like :nth-child(2)),
e) yet the structure ensures that there are no loops in the tree.