通常,树数据结构的组织方式是每个节点都包含指向其所有子级的指针。
+-----------------------------------------+
| root |
| child1 child2 child3 |
+--+------------------+----------------+--+
| | |
+---------------+ +---------------+ +---------------+
| node1 | | node2 | | node3 |
| child1 child2 | | child1 child2 | | child1 child2 |
+--+---------+--+ +--+---------+--+ +--+---------+--+
| | | | | |
这看起来很自然,但是会带来一些问题。例如,当子节点的数量变化时,您需要诸如数组或列表之类的内容来管理子节点。
通过仅使用(第一个)子级和(下一个)兄弟级指针,我们得到如下所示的内容:
+-------------------+
| root |
| child sibling +--->NULL
+--+----------------+
|
+----------------+ +----------------+ +----------------+
| node1 | | node2 | | node3 |
| child sibling +--->| child sibling +--->| child sibling +--->NULL
+--+-------------+ +--+-------------+ +--+-------------+
| | |
显然,这种结构也可以代表树木,但是它也提供了一些优势。最重要的是,我们不必再担心子节点的数量。当用于解析树时,它为“ a + b + c + d + e”之类的术语提供了自然的表示,而不会成为一棵深树。
集合库是否提供像这样的树结构?解析器是否使用这种结构?若否,原因为何?