試験中にこの質問があり、すぐに回答が見つかりませんでした。BSTから順番に番号を削除します
いくつかの順序番号A = [1,3,6,9,11]と数字をキーとするBSTを含む配列Aがあります。 BSTからAの数字を削除する効率的な再帰アルゴリズムを提供する必要があります。
問題はノードを削除することではなく、ノードを削除する際に配列が順序付けされているという事実をどのように使うかです。
誰かがヒントを教えてもらえますか?
試験中にこの質問があり、すぐに回答が見つかりませんでした。BSTから順番に番号を削除します
いくつかの順序番号A = [1,3,6,9,11]と数字をキーとするBSTを含む配列Aがあります。 BSTからAの数字を削除する効率的な再帰アルゴリズムを提供する必要があります。
問題はノードを削除することではなく、ノードを削除する際に配列が順序付けされているという事実をどのように使うかです。
誰かがヒントを教えてもらえますか?
これは考えられる方法の1つです。
BST(standard recursive algorithmを使用)とA
(左から右)の両方を同時にトラバースすることができます。トラバースのそれぞれは、要素を昇順で生成します。あなたはツリーからそれらを削除するために一致する要素を探しています。
純粋なアルゴリズムは、O(size(BST))
時間の複雑さを持ちます。
場合によっては、左のサブツリーを完全に見ることを避けることができます。ツリー内の「現在の」ノードの値は、左のサブツリーの値の上限を示します。 A
の「現在の」要素は、左のサブツリーをスキップします。
A
を使い切ったらすぐにアルゴリズムを停止することもできます。
BSTをルートノードで表します。
引数array
とbst
持つ関数delete-array-from-bst
である:array
又はbst
が空の場合
bst
のルートノードの値アレイの分割はバイナリ検索であるため、各アレイ値をルートノードと比較する必要はありません。サブアレイは元の配列と構造を共有できます。最後に等しい値を削除すると、配列内の各値に対して最悪の削除ケースが発生することはありません。
http://en.wikipedia.org/wiki/Binary_search_tree#Deletion – quasiverse
これにはO(n + k)解決策があります。バランスの取れていないツリーの場合は、配列[O(k)]のすべての要素を読み込み、バランスのとれていないBSTの要素を1つ削除する必要があるため、チェーン]あなたはそれにintrestedですか?または、バランスのとれたBSTのためにさらに最適化されたものをお探しですか? – amit
ありがとうございますamit:私はすべてのケースを考慮する必要があるので、私は木の上に仮定を持っていません。 – JustB