blog

アルゴリズムレビュー:バイナリ探索木の削除

見つけたら削除してください。 説明: アルゴリズムの時間複雑度がOで、hが木の高さであることが必要です。 概念を明確にして解析しなさい.BSTのノードを削除するには、まずそのノードを見つける必要があり...

Sep 11, 2020 · 3 min. read
シェア

2つのセクションでは、学びました。そして、BST内の要素を削除するにはどうすればよいのでしょうか?これは、このセクションの例を通して学びます!

以下も例を通して説明します。

トピック分析

ルート・ノードと値 key を持つバイナリ探索木が与えられた場合、バイナリ探索木の key に対応するノードを削除し、バイナリ探索木の性質が変わらないようにします。バイナリ探索木のルート・ノードへの参照を返します。

一般的に、ノードの削除は2つのステップで行うことができます:



  • まず、削除するノードを見つけます;
  • 見つけたら削除してください。


説明: アルゴリズムの所要時間はO(h)で、hは木の高さです。



root = [5,3,6,2,4,null,7]
key = 3
 5
 / \
 3 6
 / \ \
2 4 7
削除するノードの値が3だとすると,まずノード3を見つけて削除する.
正解は[5,4,6,2,null,null,7], 下記をご覧いただきたい 
 5
 / \
 4 6
 / \
2 7
もうひとつの正解は[5,2,6,null,4,null,7]。
 5
 / \
 2 6
 \ \
 4 7

両セクションを最初に学習することを強くお勧めします!

最良の学習成果を得るために

改訂と統合

まず、2進探索木の性質を復習します:



  • 左のサブツリーが空でない場合、左のサブツリーのすべての値がルート・ノードの値より小さい。
  • 右のサブツリーが空でなければ、右のサブツリーのすべての値がルート・ノードの値より大きい。
  • その左と右のサブツリーもそれぞれバイナリ探索木です。


典型的なBSTは以下の写真:

図解分析

コンセプトの明確化と分析BSTのノードを削除するには、まずノードを見つける必要があります。そして、見つかった後、3つのシナリオが発生します。



1.削除されるノードの左サブツリーが空である場合、削除されるノードの右サブツリー自身を置き換えます。

2.削除されるノードの右サブツリーが空である場合、削除されるノードの左サブツリー自身を置き換えます。

3.削除するノードの左右のサブツリーが空でない場合。現在のノードより小さい最大のノードを見つけ、それ自身を置き換える必要があります。

または現在のノードより大きい最小のノードと入れ替わります。

それを分析した後、コードがそれをどのように実装しているかを一緒に見てみましょう。

GO言語の例

ここでは、後継ノードを介して自分自身を置き換えるスキームを示します:

func deleteNode(root *TreeNode, key int) *TreeNode {
 if root == nil {
 return nil
 }
 if key < root.Val {
 root.Left = deleteNode( root.Left, key )
 return root
 }
 if key > root.Val {
 root.Right = deleteNode( root.Right, key )
 return root
 }
 //これはターゲットが見つかったことを意味する
 if root.Right == nil {
 //右のサブツリーは空である
 return root.Left
 }
 if root.Left == nil {
 //左のサブツリーは空である
 return root.Right
 }
 minNode := root.Right
 for minNode.Left != nil {
 //後継者を探す
 minNode = minNode.Left
 }
 root.Val = minNode.Val
 root.Right = deleteMinNode( root.Right )
 return root
}
func deleteMinNode( root *TreeNode ) *TreeNode {
 if root.Left == nil {
 pRight := root.Right
 root.Right = nil
 return pRight
 }
 root.Left = deleteMinNode( root.Left )
 return root
}

実施結果:

私が書いたすべての解答と各問題の完全な図解をeBookにまとめました。

Read next

jsは、URL内の指定されたパラメータの値を取得する

locationの8つの属性はすべて読み書き可能ですが、hrefとhashだけが意味を持ちます。例えば、変更はURLにリダイレクトし、変更は現在のページにジャンプします anchor(&#x3C; a id="name">or&#x3C; div id="id...

Sep 11, 2020 · 1 min read