私が立ち往生している宿題の質問を手伝ってくれませんか。
完全な二分木の極小値は、そのすべての隣接ノード(隣接ノード=親、左の子、右の子)よりも小さいノードとして定義されます。O(logn)複雑度時間で、ノードごとに異なる数を持つ、与えられた完全な二分木で極小値を見つける必要があります。
さて、要件はO(logn)なので、私は木を通り抜けて葉まで1つのパスだけを通過する方法を考えようとしました。または、再帰で毎回ツリーの半分しか見ることができず、この方法でログが記録されます。
だから私はこれをツリーに持っていると言います:
70
/ \
77 60
3つのケースがあります:
1)ルートが左と右の両方の子よりも小さい//これで完了です
2)根は左よりも小さいだけです
3)根は右よりも小さい
上記のツリーはケース2です。77は親よりも大きいため、77を「ローカル最小値」にする方法がないため、左側のサブツリーを「捨ててしまおう」としましょう。したがって、右側のサブツリーが残ります。極小値が見つかるまで、以下同様です。
ここでの問題は、その左側のサブツリーをスローすると、下にある別のローカル最小値を見逃す可能性があることです。次に例を示します。
70
/ \
77 60
/ \ / \
1 8 9 14
/ \ / \ / \ / \
3 4 5 6 2 7 15 13
したがって、この場合、ローカルの最小値は「1」のみですが、最初にルートの右側のサブツリーを検索することにしたため、これを見逃しました。