通常、ツリーデータ構造は、各ノードがそのすべての子へのポインタを含むように編成されます。
+-----------------------------------------+
| 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」などの用語の自然な表現を提供します。
コレクションライブラリはそのようなツリー構造を提供しますか?パーサーはそのような構造を使用しますか?そうでない場合、その理由は何ですか?