二分木を表していると主張されている次の配列について考えてみます。
[1、2、5、6、-1、8、11]
値が-1のインデックスがルート要素を示しているとすると、以下の質問があります。
a)これは実際にどのように表されますか?
以下の式( このリンクからのソース )に従ってツリーを理解する必要がありますか? 3つの簡単な式を使用すると、親のインデックスから子のインデックスに、またはその逆に移動できます。
* if index(parent) = N, index(left child) = 2*N+1
* if index(parent) = N, index(right child) = 2*N+2
* if index(child) = N, index(parent) = (N-1)/2 (integer division with truncation)
上記の式を使用すると、index(root)= 3、index(left child)= 7となり、存在しません。
b)それが完全な二分木であるかどうかを知ることは重要ですか?
配列が与えられると、その配列が二分木をどのように表すことができるかについて、いくつもの方法を考えることができます。したがって、知る方法はありません。その配列のソースに移動する必要があります(それが何であれ)。
それらの方法の1つは、リンクに従って、バイナリヒープが通常表される方法です。これが使用された表現である場合、-1はルート要素ではありません。また、位置3のノードには子がありません。つまり、葉になります。
そして、ええ、それが完全なツリーであることになっているのかどうかを知ることはおそらく重要です。
一般に、このようなデータの意味を理解しようとしないでください。ドキュメントまたはデータを使用するソースコードが提供されます。それがなく、本当にリバースエンジニアリングする必要がある場合は、データについてもっと知る必要があるでしょう。それを使用するコードの動作を観察することはあなたを助けるはずです。または、コードを逆コンパイルします。
リストされているルールでは親がないため、N = 0はルートノードである必要があります。負のNがないと仮定すると、式(2 * N + 1)または(2 * N + 2)のいずれからも0を作成することはできません。
Indexは配列に格納されている値ではなく、配列内の場所であることに注意してください。 [1、2、5、6、-1、8、11]の場合インデックス0 = 1インデックス1 = 2インデックス2 = 5など。
完全なツリーの場合、-1は有効な値であり、ツリーは
1
/ \
2 5
/ \ / \
6 -1 8 11
-1は「NULL」ポインタである可能性もあり、そのノードに値が存在しないことを示します。
したがって、ツリーは次のようになります。
1
/ \
2 5
/ / \
6 8 11
完全な二分木ではないかもしれませんが、任意のものでもないかもしれません。右端の数枚の葉が最大でいくつか欠落しているツリーを表すことができます(または、規則を左と右の子と交換する場合は、左端の数枚の葉が欠落しているだけです)。
これを配列で表すことはできません。
A
/ \
B C
/ /
D E
しかし、あなたはこれを表すことができます
A
/ \
B C
/ \
D E
またはこれ:
A
/ \
B C
/ \
D E
(最後に、2k + 1をright子、2k + 2をleft子にします)
3つのノードの数を知る必要があるだけです。