場合によっては、単に配列を使用してノードを保持することができます。の二分木ノードには、からへarr[i]
の子があります。i!= 0の場合、その親はになります。もちろん、実際のポインタアドレスを計算するには、と言うことができます。これは実際には、ヒープに使用されるツリーのように、仕様によっていっぱいになるツリーのかなり一般的な実装です。arr[(i*2)+1]
arr[(i+1)*2]
arr[(i-1)/2]
&arr[i]
ただし、ノードがその子を見つける方法を自分自身で知るためには、コンテナへのインデックスまたはポインタのいずれかが必要になる可能性があります。(それでも、2つのピースのうちの1つだけでは、少しフープジャンプを行う必要があります。簡単に行うには、両方のピースが本当に必要です。。しかし、覚えるのではなく計算する必要があるのは、あまり覚えないようにするときに支払う代償です。)かなりスペース効率の良いものを維持するには、ノードをダムダウンする必要があります。それらを基本的に構造体、あるいは値だけにして、ツリークラスにすべてのノード検索を実行させます。ノードへのポインターを渡すだけで、そのポインターは、コンテナーがノードのインデックス(したがって、その子がどこにあるか)を把握するために必要なすべてのものになります。また、ツリーをトラバースする関数には、ツリーポインターとノードポインターの両方を渡す必要があります。
ただし、これにより、ツリーが常にほぼ満杯にならない限り(つまり、リーフノードのほとんど/すべてが最後にない限り)、多くのスペースを節約できないことに注意してください。ツリーの最下部(最上部がルート)にないすべてのリーフノードについて、((ノードサイズ)*(ツリーサイズ/ i))バイトのようなものを浪費します。
ツリーがいっぱいになっている、またはノードが特定の制限されたスペースにあることを期待できない場合は、ここで最適化することはそれほど多くありません。ツリーの要点は、ノードが子へのポインタを持っていることです。配列で偽造することもできますが、価値のあるツリーを作成するには、ノードの子を簡単に見つけることができる必要があります。