私はProject Euler Problem 18に取り組んでいました(私は問題を解決しました。ごまかしているわけではありません。「証明」はここにあります)、パスカルの三角形のように見えるデータ構造を表現する方法が必要であることに気付きましたが、値は異なります。 . 二分木に非常によく似ていますが、非常に重要な違いがあります。ノードの子は、ノードの子だけではありません。したがって、最初の 3 行は次のようになります。
75
/ \
95 64
/ \ / \
17 47 82
47 には 2 つの親があることに注意してください。
これをリンクされた構造や 2 次元配列として表現するのは非常に簡単ですが、もっと洗練された方法があることを願っています。私は二分木が大好きです。主に、単一のメモリ チャンクを割り当て、それを配列として扱い、いくつかの算術演算または整数除算を使用して子と親の間を移動する方法です。このデータ構造に対して同じことを行う方法はありますか?
私の最善の解決策は、2 次元配列を使用することでした (子と親を見つけるのは非常に簡単です)。私はこの実装が嫌いです (少なくとも私が行った方法では)malloc
構造がどれだけ大きくなるかを事前に知っていたにもかかわらず、すべての行を呼び出したからです。
私の質問はこれと非常によく似ていますが、受け入れられた回答には満足できませんでした。コメントは私が求める解決策をほのめかしていますが、説明はありません。
編集:明確にするために、配列に (1 から始まる) バイナリ ツリーが順番に詰め込まれるのと同じ方法で、1 次元配列にインデックスを付ける方法を探しています。インデックス 2 * iおよび 2 * i + 1 にあります。また、親を見つけることができるかどうかについてもあまり心配していないので、奇妙な 2 つの親についてはあまり心配しないでください。