最初の子と次の兄弟の 2 つのポインターを持つ典型的な「バイナリ ツリーとして表される一般的なツリー」のように聞こえます。各子に下向きの矢印と右向きの矢印がある、標準のバイナリ ツリーとしてツリーを描くことができます。
あなたのコメントで説明されているツリーは次のようになっていると思います。
a
|
V
b ------------> c
| |
V V
d --> e --> f g
|
V
h --> i
ツリーの各ノードで、次のことを行います。
- 最初の子を処理して、最初にすべての子孫を出力します (下向き矢印に従います)。
- 次に、ノードの値を出力します
- 次に、兄弟を処理します (右矢印に従います)。
これを上記のツリーに適用すると、次のようになります。
GeneralTreePostOrder(a) ->
GeneralTreePostOrder(b) -> # Follow child pointer
GeneralTreePostOrder(d) -> # Follow child pointer
# No children
print d
GeneralTreePostOrder(e) -> # Follow sibling pointer
# No children
print e
GeneralTreePostOrder(f) -> # Follow sibling pointer
# No children
print f
# No more siblings
print b
GeneralTreePostOrder(c) -> # Follow sibling pointer
など、印刷しd e f h i g c a
ます。
一般ツリー用の新しい関数を作成します (NBprintf
は二重引用符で囲まれた書式文字列を使用する必要があります):
void GeneralTreePostOrder (node* root) {
if (root == NULL)
return;
else {
GeneralTreePostOrder (root->left); // Process children
printf ("%c", root->key);
GeneralTreePostOrder (root->right); // Process siblings
}
}