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にまとめました。




